19

Maven でビルドされた Web プロジェクトがあり、RequireJS コンパイラで JavaScript ファイルをコンパイルする最良の方法を見つけようとしています (この質問は、任意のコンパイラ/ミニファイアにも適用される可能性があります)。

動作するセットアップがありますが、改善が必要です:

サードパーティの JavaScript ライブラリをパッケージ化しました。それらは依存関係としてダウンロードされ、WAR Overlay プラグインに追加されています。

ターゲットディレクトリ内で RequireJS コンパイラを実行する Exec プラグイン タスクがあります。現在、パッケージ ターゲットの実行後に手動で実行exec:execしています (したがって、WAR の内容はターゲット ディレクトリに配置されます)。

私が代わりに望むのは、JS コンパイルをメイン (Java) コンパイルの一部にすることです。JS コンパイラ自体 (Require JS) は、コンパイル後に発生する WAR オーバーレイ フェーズ中に依存関係としてダウンロードされます。したがって、Require JS ファイルをダウンロードして解凍する必要があり、Java コンパイルの前/最中/後に、これらのファイルを使用して JS コンパイルを実行する必要があります。

これを達成するにはいくつかの方法があると確信しています。最もエレガントなソリューションを探しています。


更新: 既存の POM スニペット

zip してリポジトリ マネージャーに追加した 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 自体 (残りのライブラリのコンパイルに必要) も外部依存関係として読み込まれることに注意してください。まず、RequireJS のコンパイルを開始する前に、この依存関係をダウンロードして解凍する必要があります。

これらの依存関係は、WAR オーバーレイ プラグインを使用して WAR に追加されています。

        <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>

WAR に参加する必要はありませんがrequirejs/build/**、これをオーバーレイの一部として含めて、解凍された RequireJS ビルド スクリプトを取得します。

次に、コンパイルを実行する Exec プラグイン タスクがあります。ただし、このタスクは通常のコンパイル ワークフローに追加されていないことに注意してください。WAR のパッケージ化が完了し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. コンパイルと WAR パッケージのステップで、単一の圧縮された依存関係のさまざまな部分を抽出するにはどうすればよいですか? それとも、2 つの zip ファイルを作成する必要がありますか?
  2. 理想的には、コンパイル中にトリガーするexec:execか、そうでない場合は、WAR パッケージの直前にトリガーしたいと考えています。それ、どうやったら出来るの?

私は実際に成功せずにたくさんのものを試してみました.などはまだ動作します。

4

3 に答える 3

8

https://github.com/jakewins/requirejs-maven

于 2011-02-23T11:26:39.907 に答える
6

RequireJS の最適化を特に対象とした Maven プラグインが次の場所にあります。

https://github.com/mcheely/requirejs-maven-plugin

常に最新バージョンの RequireJS が同梱されている必要があります。プロジェクトに別のバージョンを追加し、プラグイン構成でそのパスを指定することで、それをオーバーライドするのは非常に簡単です。

完全な開示:私はプラグインを書きました。

于 2012-07-19T04:23:10.180 に答える
4

私は私のために働く次の解決策を思いつきました:

RequireJS ファイルのアンパックを WAR オーバーレイに依存する代わりに、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 パッケージの内容全体を「依存関係」フォルダーの下に置くことができます。だから、私が持っている次のものは:

      <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 ディレクトリに触れることなく、「依存関係」フォルダー内で RequireJS コンパイルがトリガーされます。次に、WAR オーバーレイ プラグインを使用して、WAR に入れたい RequireJS ファイルを厳選します。

アップデート

このソリューションを書いて以来、Hudson を介して RequireJS コンパイラのシェル スクリプト + バッチ ファイルを使用する際に問題があったため、"exec" の代わりに "java" ゴールを使用するように切り替えました。基本的に、Rhino を介してコンパイラを実行する最終的な Java コマンド (スクリプトによって生成されたもの) を実行しています。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>
于 2011-01-19T03:17:44.300 に答える