Projeto RequireJS Compilation in Maven com dependências JS externas

Eu tenho um projeto da Web que foi criado com o Maven e estou tentando descobrir a melhor maneira de compilar os arquivos JavaScript com o compilador RequireJS (essa pergunta pode se aplicar a qualquer compilador / minificador também).

Eu tenho uma configuração que funciona, mas precisa de melhorias:

Empacotei as bibliotecas JavaScript de terceiros e elas estão sendo baixadas como dependências e adicionadas ao plugin WAR Overlay.

Eu tenho uma tarefa de plug-in Exec que executa o compilador RequireJSdentro do alvo diretório. Atualmente, eu corro manualmenteexec:exec após a execução do destino do pacote (e, portanto, o conteúdo do WAR é colocado no diretório de destino).

O que eu gostaria, em vez disso, é tornar a compilação JS parte da compilação principal (Java). O próprio compilador JS (Exigir JS) é baixado como uma dependência durante a fase de sobreposição WAR que ocorre após a compilação. Portanto, preciso que os arquivos JS de Exigência sejam baixados e descompactados e preciso executar a compilação JS usando esses arquivos, antes / durante / após a compilação Java.

Tenho certeza de que pode haver várias maneiras de conseguir isso. Estou procurando a solução mais elegante.

Atualização: fragmentos de POM existentes

Tenho dependências de JavaScript que zipei e adicionei ao nosso gerenciador de repositório:

    <dependency>
        <groupId>org.requirejs</groupId>
        <artifactId>requirejs</artifactId>
        <version>0.22.0</version>
        <classifier>repackaged</classifier>
        <type>zip</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.jqueryui</groupId>
        <artifactId>jquery-ui</artifactId>
        <version>1.8.7</version>
        <classifier>repackaged</classifier>
        <type>zip</type>
        <scope>runtime</scope>
    </dependency>

Observe que o próprio RequireJS (necessário para a compilação do restante das bibliotecas) também é carregado como uma dependência externa. Portanto, a primeira coisa é que eu preciso que essa dependência seja baixada e descompactada antes que eu possa começar a compilação do RequireJS.

Essas dependências estão sendo adicionadas ao WAR usando o plugin WAR Overlay:

        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <overlays>
                    <overlay>
                        <groupId>org.requirejs</groupId>
                        <artifactId>requirejs</artifactId>
                        <classifier>repackaged</classifier>
                        <type>zip</type>
                        <targetPath>lib</targetPath>
                        <includes>
                            <include>requirejs/require.js</include>
                            <include>requirejs/require/*</include>
                            <include>requirejs/build/**</include>
                        </includes>
                    </overlay>
                    <overlay>
                        <groupId>com.jqueryui</groupId>
                        <artifactId>jquery-ui</artifactId>
                        <classifier>repackaged</classifier>
                        <type>zip</type>
                        <targetPath>lib</targetPath>
                    </overlay>
                </overlays>
            </configuration>
        </plugin>

Mesmo que eu não preciserequirejs/build/** Para terminar no WAR, incluí-o como parte da sobreposição para obter os scripts de compilação do RequireJS descompactados, simplesmente porque não descobri uma maneira melhor.

Então eu tenho uma tarefa de plug-in Exec que executa a compilação. Mas observe que esta tarefa não foi adicionada ao fluxo de trabalho de compilação normal: tenho que invocá-la manualmente commvn exec:exec depois de o empacotamento WAR é feito:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <executable>lib/requirejs/build/build.bat</executable>
                <workingDirectory>${project.build.directory}/${project.artifactId}</workingDirectory>
                <arguments>
                    <argument>name=bootstrap</argument>
                    <argument>out=combined.js</argument>
                    <argument>baseUrl=scripts</argument>
                    <argument>optimize=closure</argument>
                    <argument>excludeShallow=plugins/manifest</argument>
                </arguments>
            </configuration>
        </plugin>

Então, algumas perguntas são:

Como posso extrair partes diferentes de uma única dependência compactada para as etapas de compilação e empacotamento WAR? Ou tenho que criar dois arquivos zip, um com apenas o material de tempo de execução e o outro para scripts de compilações?Eu gostaria de desencadearexec:exec idealmente durante a compilação ou, se não, imediatamente antes da embalagem do WAR. Como faço isso?

Na verdade, eu tentei várias coisas sem sucesso, então espero não parecer tão preguiçoso postando um grande pedaço de código e esperando por respostas :) É só que eu ainda não entendi como o Maven é direcionado / fases etc trabalho ainda.

questionAnswers(3)

yourAnswerToTheQuestion