web-dev-qa-db-ja.com

MavenからGruntプロジェクトをコンパイルすることは可能ですか?

Node.jsなどをインストールせずに、Maven内から単調なタスクを実行しようとしています。これは、Jenkinsによってパッケージ化されるアーティファクトを望んでおらず、そのマシンにNode.jsをインストールできないためです。

Npmといくつかのコマンドを使用して簡単に機能することは簡単ですが、mavenと統合するのは簡単だと思います.

41
gfournier

はい、 frontend-maven-plugin を使用して、Mavenを介してGruntプロジェクトをコンパイルできます( NodeJSメーリングリスト で見つかります)。

ドキュメントが指摘しているように、プラグインには次の機能があります。

  • フロントエンドとバックエンドのビルド間の相互作用の量を最小限に抑えることで、フロントエンドとバックエンドのビルドを可能な限り分離させてください。 1つのプラグインのみを使用します。
  • ビルドシステムにNode/NPMをグローバルにインストールせずに、ビルドプロセスでNode.jsとそのライブラリを使用できるようにします
  • Nodeのバージョンと実行中のNPMがすべてのビルド環境で同じであることを確認してください

コードをひととおり見てきましたが、かなり簡単です。誰かがようやくこれをまとめてくれてありがとう。それはエレガントなソリューションです。リポジトリには が含まれており、通常のGruntfile.jsを使用してjshint分析を呼び出します。

29
blong

UPDATE 2014-09-19:これはもはや最も正確な答えではありません。以下の他の答えのいくつかを見てください。私が質問に答えた時点では正確でしたが、それ以来、この分野でかなりの進歩があったようです

私はあなたが運が悪いのではないかと心配しています。 Gruntはノードを使用して構築され、npmを使用してインストールする必要があります。 npmを使用したくない場合は、Gruntの既存のインストールを別のマシンからコピーできますが、ビルドサーバー上のgrunt実行可能ファイルとその依存関係はすべて使用します。

それに加えて、Gruntタスクの多くはNode.jsモジュールとして実装されており、それらもインストールする必要があります。繰り返しますが、Node.js/Gruntのインストールを行った別のサーバーからそれらをコピーできるかもしれませんが、ある時点で、それをしなければなりません。

MavenからGruntを実行するには、Maven execプラグインを使用してからそこからgrunt実行可能ファイルを実行するのが最善の策です。

別の方法として、Javaベースの方法でGruntに似たことができるMavenプラグインがいくつかあります。 Gruntと互換性のない追加の構成が必要なので、YMMV。私が過去に使用したものは http://code.google.com/p/wro4j/ で、これにはMavenプラグインも付属しています: http:// code .google.com/p/wro4j/wiki/MavenPlugin

ビルドサーバーにNode.jsをインストールできない特別な理由はありますか?

15
nwinkler

grunt-maven-plugin を使用できます。 GruntタスクをMavenビルドプロセスに簡単に統合できます。汚いハッキングはありません。

これは現在のプロジェクトで使用しているもので、完璧に機能します。

11
pbetkier

最終的に私はこれで終わりました(これは十分に近いですが、問題を解決しません):

<plugin>
<groupId>org.mule.tools.javascript</groupId>
<artifactId>npm-maven-plugin</artifactId>
<version>1.0</version>
<executions>
    <execution>
        <phase>generate-resources</phase>
            <goals>
                <goal>fetch-modules</goal>
            </goals>
            <configuration>
                <packages>
                    <package>grunt-cli:0.1.6</package>
                </packages>
            </configuration>
        </execution>
    </executions>
</plugin>

これはローカルにgrunt-cliをインストールしますが、node.jsをインストールしていない場合は価値がありません。 node.jsをローカルにインストールしようとしていますが、python、g ++、およびmakeをインストールする必要があります。そこで、KISS解決策:ビルドサーバーにgruntをインストールします。

参照:
https://github.com/mulesoft/npm-maven-plugin
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
https://github.com/mcheely/requirejs-maven-plugin

10
gfournier

http://jhipster.github.io/ をチェックアウトすることをお勧めします。これは、Maven、Grunt、およびBowerがすべて連携して動作するアプリケーションを生成するYeomanジェネレーターです。

3番目のオプションに少し似ていますが、すべてが自動的に構成されているため、それほど簡単ではありません。また、基本的なAngularJSとJava =RESTサービスを生成します

6
Er KK Chopra

これは、フロントビルドにfrontend-maven-pluginを使用し、warをビルドするmaven-war-pluginを使用して2017年に機能する完全なコピー/貼り付けソリューションです。

それは何ですか? npm、bower grunt、および必要なものをすべてインストールしてから、npm install、bower install、最後にgrunt buildを実行します。

必要な手順を削除/追加することができます。私にとっては、完全な30秒のインストール/ビルドライブラリとプロジェクトです。

<dependencies>
  ...
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.github.eirslett/frontend-maven-plugin -->
        <dependency>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>src/main/webapp/YourFrontJsFolder/dist</warSourceDirectory>
                    <warName>YouWarName</warName>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warSourceExcludes>node_modules/**</warSourceExcludes>
                    <includeScope>system</includeScope>
                    <webResources>
                        <resource>
                            <directory>WebContent/WEB-INF</directory>
                            <targetPath>WEB-INF</targetPath>
                            <includes>
                                <include>**/*.jar</include>
                                <include>**/*.jsp</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>Cp1252</encoding>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <finalName>YourAppName</finalName>
</build>

<profiles>
    <profile>
        <id>release</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.github.eirslett</groupId>
                    <artifactId>frontend-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <!-- optional: you don't really need execution ids, but it looks 
                                Nice in your build log. -->
                            <id>install node and npm</id>
                            <goals>
                                <goal>install-node-and-npm</goal>
                            </goals>
                            <!-- optional: default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <nodeVersion>v7.6.0</nodeVersion>
                            </configuration>
                        </execution>

                        <execution>
                            <id>npm install</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>

                            <!-- optional: default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <arguments>install</arguments>
                            </configuration>
                        </execution>

                        <execution>
                            <id>bower install</id>
                            <goals>
                                <goal>bower</goal>
                            </goals>

                            <configuration>
                                <!-- optional: The default argument is actually "install", so unless 
                                    you need to run some other bower command, you can remove this whole <configuration> 
                                    section. -->
                                <arguments>install</arguments>
                            </configuration>
                        </execution>

                        <execution>
                            <id>grunt build</id>
                            <goals>
                                <goal>grunt</goal>
                            </goals>

                            <!-- optional: the default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <!-- optional: if not specified, it will run Grunt's default task 
                                    (and you can remove this whole <configuration> section.) -->
                                <arguments>build</arguments>
                            </configuration>
                        </execution>
                    </executions>

                    <configuration>
                        <installDirectory>target</installDirectory>
                        <workingDirectory>src/main/webapp/YourFrontJsFolder</workingDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>debug</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>IDE</id>
        <activation>
            <property>
                <name>m2e.version</name>
            </property>
        </activation>
        <build>
            <!-- Put the IDE's build output in a folder other than target, so that 
                IDE builds don't interact with Maven builds -->
            <directory>target-ide</directory>
        </build>
    </profile>
</profiles>

その後、Run as-> Maven build ...、目標clean installおよびプロファイルrelease

3
amdev

最初の問題は、MavenはJavaですが、Grunt.jsはNode.jsランタイムで実行されることです。私がこれまでに達成した最も簡単な統合には、maven-exec-pluginが関係していました。 maven-exec-pluginは、.sh/.bat/.cmdスクリプト(使用しているOSに固有のもの)を実行できます。したがって、Mavenのビルド中に、maven-exec-pluginにoptimize-js.shという名前のスクリプトを実行させます。このスクリプトは、単に "grunt release –force"などを実行します。スクリプトは何でもできます。重要なことは、正しい作業ディレクトリでそれらを実行するようにmaven-exec-pluginを構成することです。もちろん、「うなり声」と「ノード」はコマンドラインから実行可能である必要があります。

1
jdobry

問題がJenkinsマシンにNodeJSをインストールしている場合、NodeJS Jenkinsプラグインを使用できます。

https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin

Mavenでは(まだ)使用していませんが、うなり声を上げて実行しています。

1
jamie

exec-maven-pluginで実行できます。

package.jsonscriptgrunt-cliへの依存関係を定義します:

...
  "scripts": {
    "build": "./node_modules/.bin/grunt install"
  },
  "devDependencies": {
  "grunt-cli": "^1.2.0",
...

POMで、実行するコマンドを追加します。

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>X.Y.Z</version>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-grunt-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>run</argument>
                            <argument>build</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

これはmvn packageで実行されます

0
Tomas Bjerre