Ответ 1
Я придумал следующее решение, которое работает для меня:
Вместо того, чтобы зависеть от наложения WAR для распаковки файлов RequireJS, я явно распаковываю их с помощью плагина Dependency:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.requirejs</groupId>
<artifactId>requirejs</artifactId>
<version>0.22.0</version>
<type>zip</type>
<classifier>repackaged</classifier>
<overWrite>true</overWrite>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
Фаза установлена на "компиляцию". Это позволяет мне во время компиляции загрузить содержимое пакета RequireJS в папку "dependency". Итак, следующее, что у меня есть:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>
${project.build.directory}/dependency/requirejs/build/build.bat</executable>
<workingDirectory>
${basedir}/src/main/webapp</workingDirectory>
<arguments>
<argument>name=bootstrap</argument>
<argument>out=scripts/compiled.js</argument>
<argument>baseUrl=scripts</argument>
<argument>optimize=closure</argument>
<argument>
excludeShallow=plugins/manifest</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
Это вызывает компиляцию RequireJS внутри папки "dependency", не затрагивая ни мою исходную директорию, ни каталог WAR. Затем я продолжаю использовать плагин WAR overlay для вишни, чтобы выбрать файлы RequireJS, которые хотят войти в WAR.
Обновление
С момента написания этого решения я переключился на использование цели "java" вместо "exec", потому что у меня были проблемы с использованием оболочки компилятора RequireJS script + пакетного файла через Hudson. Я в основном запускаю последнюю команду Java (сгенерированную скриптами), которая запускает компилятор через Rhino. Решение Node будет немного отличаться. Для RequireJS 0.23.0 это выглядит примерно так:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>compile-js</id>
<phase>compile</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>java</executable>
<workingDirectory>${basedir}/src/main/webapp</workingDirectory>
<arguments>
<argument>-classpath</argument>
<!--argument>${project.build.directory}/dependency/requirejs/build/lib/rhino/js.jar${path.separator}${project.build.directory}/dependency/requirejs/build/lib/closure/compiler.jar</argument -->
<argument>${project.build.directory}/dependency/requirejs/build/lib/rhino/js.jar</argument>
<argument>org.mozilla.javascript.tools.shell.Main</argument>
<argument>${project.build.directory}/dependency/requirejs/bin/x.js</argument>
<argument>${project.build.directory}/dependency/requirejs/bin/</argument>
<argument>${project.build.directory}/dependency/requirejs/build/build.js</argument>
<argument>name=bootstrap</argument>
<argument>out=scripts/compiled.js</argument>
<argument>baseUrl=scripts</argument>
<argument>optimize=none</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>