我正在尝试从maven内执行grunt任务,而无需安装Node.js或任何东西。这是因为我不想让Jenkins打包我的工件,我无法在那台机器上安装Node.js。
我知道使用npm和一些命令很容易让它工作,但我也认为它应该很容易与maven集成,问题是我不知道从哪里开始因为我是新的到npm。
答案 0 :(得分:28)
是的,使用frontend-maven-plugin,您可以通过Maven编译Grunt项目(通过NodeJS mailing list找到)。
正如文档所指出的,该插件具有以下功能:
- 让你的前端和后端版本尽可能分开,通过减少它们之间的交互量到最低限度;仅使用1个插件。
- 让您在构建过程中使用Node.js及其库,而无需为构建系统全局安装Node / NPM
- 让您确保在每个构建环境中运行的Node和NPM的版本相同
我已经完成了代码并且它非常简单。谢天谢地,有人终于把它放在了一起;这是一个优雅的解决方案。存储库包括an example,它使用常规Gruntfile.js
来调用jshint分析。
答案 1 :(得分:15)
更新2014-09-19:这不再是最准确的答案 - 请看下面的其他一些答案。当我回答这个问题时,这是准确的,但从那时起,这个领域似乎取得了很大的进展。
我怕你运气不好。 Grunt是使用节点构建的,需要使用npm进行安装。如果您不想使用npm,则可以从另一台计算机复制现有的Grunt安装,但仍会在构建服务器上使用grunt
可执行文件及其所有依赖项。
除此之外,许多Grunt任务都是作为Node.js模块实现的,您也必须安装它们。同样,您可以从已经完成Node.js / Grunt安装的另一台服务器复制它们,但有一次,您必须这样做。
要从Maven运行Grunt,最好的办法是使用Maven exec插件,然后从那里执行grunt可执行文件。
作为替代方案,有几个Maven插件允许您以基于Java的方式执行类似于Grunt的操作。它们需要与Grunt不兼容的其他配置,因此YMMV。我过去使用的是http://code.google.com/p/wro4j/,它也带有Maven插件:http://code.google.com/p/wro4j/wiki/MavenPlugin
您无法在构建服务器上安装Node.js的任何特殊原因?
答案 2 :(得分:11)
您可以使用grunt-maven-plugin。它允许您轻松地将Grunt任务集成到Maven构建过程中。没有肮脏的黑客。
这是我在当前项目中使用的,它的工作非常完美。
答案 3 :(得分:10)
最后我最终得到了这个(足够接近但没有解决问题):
<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
答案 4 :(得分:6)
你可能想要签出http://jhipster.github.io/:它是一个Yeoman生成器,它生成一个Maven,Grunt和Bower一起工作的应用程序。
这有点像你的第三个选项,但一切都是为你配置的,这并不容易。它还为您生成基本的AngularJS和Java REST服务
答案 5 :(得分:3)
这是一个完整的复制/粘贴解决方案,2017年使用 frontend-maven-plugin 进行前端构建,使用maven-war-plugin构建战争。
它做什么?安装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
- &gt; Maven build ...
,目标clean install
和个人资料release
答案 6 :(得分:1)
第一个问题是Maven是Java,但Grunt.js在Node.js运行时运行。我在两者之间实现的最简单的集成涉及maven-exec-plugin。 maven-exec-plugin能够执行.sh / .bat / .cmd脚本,无论哪个是您正在使用的操作系统的原生脚本。因此,在Maven构建期间,我会让maven-exec-plugin执行一个名为optimize-js.sh的脚本,例如,它可以执行类似“grunt release -force”之类的操作,或者其他任何操作。脚本可以做任何事情。重要的是配置maven-exec-plugin以在正确的工作目录中执行它们。当然,“grunt”和“node”需要从命令行执行。
答案 7 :(得分:1)
如果问题是在Jenkins机器上安装NodeJS,那么你可以使用NodeJS Jenkins插件。
https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin
我们还没有和Maven一起使用它,但是我们已经笨拙地跑了。
答案 8 :(得分:0)
可以通过 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软件包
上运行