Node.jsなどをインストールせずに、Maven内からgruntタスクを実行しようとしています。これは、アーティファクトをJenkinsでパッケージ化したくないため、そのマシンにNode.jsをインストールできないためです。
npmといくつかのコマンドを使えば簡単に動作することはわかっていますが、mavenとの統合も簡単なはずだと思います。問題は、npmを初めて使用するため、どこから始めればよいかわからないことです。
はい、frontend-maven-pluginを使用すると、Maven( NodeJSメーリングリストにあります)を介してGruntプロジェクトをコンパイルできます。
ドキュメントが指摘しているように、プラグインには次の機能があります。
- フロントエンドとバックエンドのビルドを可能な限り分離して、それらの間の相互作用の量を最小限に抑えましょう。1つのプラグインのみを使用します。
- ビルドシステムにNode/NPMをグローバルにインストールせずに、ビルドプロセスでNode.jsとそのライブラリを使用できるようにします
- 実行されているNodeとNPMのバージョンがすべてのビルド環境で同じであることを確認しましょう
私はコードをウォークスルーしましたが、それはかなり簡単です。誰かがついにこれをまとめてくれてありがとう。それはエレガントなソリューションです。リポジトリには、regularを使用してjshint分析を呼び出す例が含まれています。Gruntfile.js
更新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をインストールできない特別な理由はありますか?
grunt-maven-pluginを使用できます。これにより、GruntタスクをMavenビルドプロセスに簡単に統合できます。汚いハックはありません。
これは私が現在のプロジェクトで使用しているものであり、完璧に機能します。
最終的に私はこれに行き着きました(これは十分に近いですが、問題を解決しません):
<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
http://jhipster.github.io/をチェックアウトすることをお勧めします。これはYeomanジェネレーターであり、Maven、Grunt、Bowerがすべて連携して動作するアプリケーションを生成します。
これは3番目のオプションに少し似ていますが、すべてが自動的に構成されているため、それほど簡単ではありません。また、基本的なAngularJSおよびJavaRESTサービスも生成します
これは完全なコピー/貼り付けソリューションであり、フロントビルドにfrontend-maven-pluginを使用し、戦争をビルドするためにmaven-war-pluginを使用して2017年に機能します。
それは何をしますか?npm、bower grunt、および必要なすべてをインストールしてから、npm install、bower installを実行し、最後にgruntbuildを実行します。
あなたはあなたが望むステップを削除/追加置換することができます、私にとってそれは完全な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
最初の問題は、MavenがJavaであるが、Grunt.jsがNode.jsランタイムで実行されることです。2つの間でこれまでに達成した最も簡単な統合には、maven-exec-pluginが含まれていました。maven-exec-pluginは、使用しているOSにネイティブな.sh / .bat/.cmdスクリプトを実行できます。したがって、Mavenのビルド中に、maven-exec-pluginにoptimize-js.shという名前のスクリプトを実行させます。このスクリプトは、単に「grunt release –force」などを実行します。スクリプトは何でも実行できるようにすることができます。重要なことは、正しい作業ディレクトリでそれらを実行するようにmaven-exec-pluginを構成することです。もちろん、「grunt」と「node」はコマンドラインから実行可能である必要があります。
問題がJenkinsマシンへのNodeJSのインストールにある場合は、NodeJSJenkinsプラグインを使用できます。
https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin
私たちは(まだ)Mavenでそれを使用していませんが、うなり声を上げています。
exec-maven-pluginで実行できます。
package.jsonでgrunt-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パッケージで実行されます