外部JS依存関係を備えたMavenプロジェクトでのコンパイルを要求します
-
10-10-2019 - |
質問
Mavenで構築されたWebプロジェクトがあり、JavaScriptファイルをrequesJSコンパイラでコンパイルする最良の方法を見つけようとしています(この質問は、任意のコンパイラ/ミニファイアにも適用できます)。
機能するセットアップがありますが、改善が必要です。
サードパーティのJavaScriptライブラリをパッケージ化しましたが、それらは依存関係としてダウンロードされてから、戦争オーバーレイプラグインを追加しました。
requirejsコンパイラを実行するエグゼクティブプラグインタスクがあります ターゲット内 ディレクトリ。私は現在手動で実行しています exec:exec
パッケージターゲットが実行された後(したがって、戦争の内容がターゲットディレクトリに配置されます)。
代わりに、JSコンピレーションをMain(Java)コンピレーションの一部にすることです。 JSコンパイラ自体(JSが必要)は、コンパイル後に発生する戦争オーバーレイフェーズ中に依存関係としてダウンロードされます。したがって、jsファイルをダウンロードしてアンパックする必要があり、Javaコンパイルの前/最中/後にそれらのファイルを使用してJSコンパイルを実行する必要があります。
これを達成するにはいくつかの方法があると確信しています。私は最もエレガントなソリューションを探しています。
更新:既存のPOMスニペット
javaScriptの依存関係を持っています。これは、リポジトリマネージャーにジップして追加しました。
<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>
必要なのは、残りのライブラリの編集に必要な要件自体も外部依存関係としてロードされることに注意してください。したがって、最初のことは、requirejsコンピレーションで開始する前に、この依存関係をダウンロードして解凍する必要があるということです。
これらの依存関係は、戦争オーバーレイプラグインを使用して戦争に追加されています。
<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>
必要はありませんが requirejs/build/**
戦争に終わるために、私はそれをオーバーレイの一部として含めて、解凍されたrequirejsビルドスクリプトを取得します。
次に、コンピレーションを実行するエグゼクティブプラグインタスクがあります。ただし、このタスクは通常のコンピレーションワークフローに追加されていないことに注意してください。 mvn exec:exec
後 戦争パッケージは行われます:
<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>
だから、いくつかの質問は次のとおりです。
- コンピレーションと戦争パッケージの手順に、1つのジップ依存関係のさまざまな部分を抽出するにはどうすればよいですか?それとも、2つのzipファイルを作成する必要がありますか?1つはランタイムのものだけ、もう1つはコンピレーションスクリプトのためですか?
- トリガーしたいのですが
exec:exec
理想的には、編集中、またはそうでない場合は、戦争包装の直前です。それ、どうやったら出来るの?
私は実際に成功せずに束を試してみましたので、膨大なコードを投稿して答えを待っているように見えないことを願っています:)それは、私がターゲット/フェーズをどのようにして私の心をまったく包んでいないということですなどはまだ機能します。
解決 3
私は自分のために働く次の解決策を思いつきました:
requirejsファイルの開梱のための戦争オーバーレイに依存するのではなく、依存関係プラグインを使用してそれらを明示的に解凍します。
<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パッケージのコンテンツ全体を置くことができます。だから、私が次に持っていることは次のとおりです。
<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>
このトリガーは、ソースディレクトリやWARディレクトリのいずれにも触れずに、「依存関係」フォルダー内でJSコンピレーションを必要とします。その後、戦争オーバーレイプラグインを使用して、戦争に参加したい要件ファイルを選択し続けます。
アップデート
このソリューションを作成して以来、「exec」の代わりに「Java」目標を使用することに切り替えました。私は基本的に、Rhinoを介してコンパイラを実行する最後のJavaコマンド(スクリプトによって生成された)を実行しています。ノードソリューションはわずかに異なります。 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>
他のヒント
requirejsの最適化を特にターゲットにしたMavenプラグインがあります。
https://github.com/mcheely/requirejs-maven-plugin
requirejsの最近のバージョンで常に出荷する必要があります。プロジェクトに別のバージョンを追加し、プラグイン構成でパスを指定することで、それをオーバーライドするのは非常に簡単です。
完全な開示:プラグインを書きました。