是否有可能从maven编译grunt项目?

我试图从maven内部执行grunt任务,而不需要安装Node.js或任何东西。 这是因为我不想让我的工件被Jenkins包装,我不能在这台机器上安装Node.js。

我知道使用npm和一些命令很容易使它工作,但我也认为应该很容易与maven集成,问题是我不知道从哪里开始,因为我是npm的新手。

是的,使用前端Maven插件 ,您可以通过Maven编译Grunt项目(通过NodeJS邮件列表find )。

正如文档指出的那样,插件具有以下function:

  • 让你尽可能地将你的前端和后端构build分离开来,把它们之间的交互量减less到最低限度; 只使用1个插件。
  • 让您在构build过程中使用Node.js及其库,而无需在您的构build系统中全局安装Node / NPM
  • 让您确保在每个构build环境中运行的Node和NPM的版本是相同的

我已经通过了代码,这很简单。 谢天谢地,终于有人把这个放在一起; 这是一个优雅的解决scheme。 存储库包含一个使用常规Gruntfile.js来调用jshint分析的示例 。

更新2014-09-19:这不再是最准确的答案 – 请看看下面的一些其他答案。 我回答这个问题的时候是准确的,但是从那以后,这个领域似乎取得了很大的进展。

恐怕你运气不好。 Grunt是使用节点构build的,需要使用npm进行安装。 如果您不想使用npm,您可能能够从另一台机器上复制现有的Grunt安装,但仍会在构build服务器上使用grunt可执行文件及其所有依赖项。

除此之外,许多Grunt任务都是以Node.js模块的forms实现的,您还必须安装它们。 再一次,你可能能够从另一个服务器上复制它们,在那里你已经完成了Node.js / Grunt的安装,但是在某一点上,你必须这样做。

为了从Maven运行Grunt,最好的办法是使用Maven exec插件,然后从那里执行grunt可执行文件。

作为替代,有几个Maven插件允许您以基于Java的方式执行类似于Grunt的事情。 他们需要额外的configuration与Grunt不兼容,所以YMMV。 我以前使用的是http://code.google.com/p/wro4j/ ,它也附带了一个Maven插件: http : //code.google.com/p/wro4j/wiki/ MavenPlugin

为什么你不能在你的构build服务器上安装Node.js?

你可以使用grunt-maven-plugin 。 它允许您轻松地将Grunt任务集成到Maven构build过程中。 没有肮脏的黑客。

这是我在当前的项目中使用的,它工作得很完美。

最后我结束了(这是足够接近,但没有解决问题):

 <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解决scheme:在生成服务器中安装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一起工作的应用程序。

这有点像你的第三个select,但一切都为你configuration,这并不容易。 它也为您生成基本的AngularJS和Java REST服务

第一个问题是Maven是Java,但是Grunt.js在Node.js运行时上运行。 我在两者之间实现的最简单的集成涉及到maven-exec-plugin。 maven-exec-plugin能够执行.sh / .bat / .cmd脚本,这些脚本都是您正在使用的操作系统的本机特性。 因此,在Maven构build期间,我会让maven-exec-plugin执行一个名为optimize-js.sh的脚本,例如,它可以简单地执行“grunt release -force”之类的任何操作。 脚本可以做任何事情。 重要的是configurationmaven-exec-plugin在正确的工作目录中执行它们。 当然,“grunt”和“node”需要从命令行执行。

如果问题是在Jenkins机器上安装NodeJS,那么你可以使用NodeJS Jenkins插件。

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

我们还没有使用Maven(但),但我们已经喘不过气来。

这是一个完整的复制/粘贴解决scheme,在2017年使用前端Maven的插件前为build立和Maven的战争插件build立战争。

它能做什么 ? 安装npm,bower grunt,以及所有你需要的东西,然后运行npm install,bower install和grunt build。

你可以删除/添加replace你想要的步骤,对我来说,这是一个完整的30秒安装/构build库和项目。

 <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和configuration文件release