Java 如何使用maven部署node.js应用程序?
我们团队的大多数成员都是java开发人员,因此整个构建/部署/依赖关系管理系统都是在maven之上构建的。我们使用CI,因此每个构建过程都运行单元测试(w.karma和phantomJS用于前端,jasmine节点用于后端)。我已经为此配置了karma maven插件 这并不能解决在构建时从package.json下载node.js依赖项的问题。我需要在现有环境中部署我的node.js/express应用程序,因此最佳方案是:Java 如何使用maven部署node.js应用程序?,java,node.js,maven,continuous-integration,npm,Java,Node.js,Maven,Continuous Integration,Npm,我们团队的大多数成员都是java开发人员,因此整个构建/部署/依赖关系管理系统都是在maven之上构建的。我们使用CI,因此每个构建过程都运行单元测试(w.karma和phantomJS用于前端,jasmine节点用于后端)。我已经为此配置了karma maven插件 这并不能解决在构建时从package.json下载node.js依赖项的问题。我需要在现有环境中部署我的node.js/express应用程序,因此最佳方案是: 从回购中提取(使用maven build自动完成) npm安装(即从
npm安装
(即从节点包注册表下载依赖项)npm install
是更好的选择
你的意见是什么?我想你可以在
Grunt
和许多可用的插件中找到答案
我实际上正在从事一个web项目,其中客户端是用AngularJS
制作的。尽管如此,我认为部署过程可能部分回答了您的问题:
在pom.xml
中,可以执行以下操作:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>exec-gen-sources</id>
<phase>generate-sources</phase>
<configuration>
<target name="Build Web">
<exec executable="cmd" dir="${project.basedir}"
failonerror="true" osfamily="windows">
<arg line="/c npm install" />
</exec>
<exec executable="cmd" dir="${project.basedir}"
failonerror="true" osfamily="windows">
<arg line="/c bower install --no-color" />
</exec>
<exec executable="cmd" dir="${project.basedir}"
failonerror="true" osfamily="windows">
<arg line="/c grunt release --no-color --force" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
. 有许多可用的插件,比如Karma
单元测试
我希望这对您有所帮助。您有两个选择:
- 让maven从package.json下载您的npm模块,并让它自动安装node和npm
- 让maven下载您在pom.xml中指定的npm包(linkdead截止2020年4月,似乎已停止)
作为一个黑客解决方案,尽管正如您所提到的,您仍然可以使用maven antrun插件之类的东西来实际使用maven执行npm
所有方法都有其优缺点,但前端maven插件似乎是最常用的方法-但它假定您的ci服务器可以从internet下载任意软件包,而当您的ci服务器根本没有连接到internet(除了代理中央maven repo)时,“黑客”解决方案也应该可以工作我通过执行maven插件为我的AngularJS 2+Spring Boot应用程序实现了npm过程。我不使用bower和grunt,但在看了上面来自Pear的antrun示例之后,我认为您也可以通过exec maven插件来实现它
下面是我的execmaven插件的pom.xml示例。我的应用程序有package.json,所有AngularJS.ts文件都在src/main/resources下,所以从路径运行npm。我为依赖项运行npm安装,为.ts转换为.js运行npm tsc
pom.xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>exec-npm-install</id>
<phase>generate-sources</phase>
<configuration>
<workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
<executable>npm</executable>
<arguments>
<argument>install</argument>
</arguments>
</configuration>
<goals>
<goal>exec</goal>
</goals>
</execution>
<execution>
<id>exec-npm-run-tsc</id>
<phase>generate-sources</phase>
<configuration>
<workingDirectory>${project.basedir}/src/main/resources</workingDirectory>
<executable>npm</executable>
<arguments>
<argument>run</argument>
<argument>tsc</argument>
</arguments>
</configuration>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
</plugin>
对于Mac,我在eclipse上也遇到了同样的问题。问题是nodejs和npm安装在/usr/local/bin下。为了解决这个问题,我将/usr/local/bin/node和/usr/local/bin/npm符号链接到/user/bin下。但是/usr/bin在安全策略中受到保护,我在从恢复磁盘启动后做了这件事,自2015年以来,有一个替代品可以替代中提到的前端maven插件
Christian Ulbrich的精彩回答:
用法
基本上,使用它所要做的就是像往常一样将其放入POM中(并使用“extensions:true”):
npm脚本“包”将作为Maven构建生命周期阶段“包”的一部分自动运行
与前端maven插件相比
就像前端maven插件一样,它将在maven项目中运行npm脚本。有两个重要的区别:
- 前端maven插件将(并且必须)下载并安装npm本身。npm maven插件使用(并要求)已安装的npm版本
- 前端maven插件要求您描述POM中的每个npm调用(作为“执行”部分)。相反,npm maven插件只是简单地扩展了,以便在每个生命周期阶段(清理、安装等)自动执行同名的npm脚本。这意味着POM中没有特定于npm的配置,所有配置都来自package.json
就我个人而言,我更喜欢npm maven插件的方法,因为它在POM中需要更少的配置。另外,将npm调用放入package.json中感觉更自然,并允许在直接调用npm时重用它们
诚然,即使使用前端maven插件,您也可以(而且可能应该)将所有npm调用定义为package.json中的脚本,并从POM中调用这些脚本,但仍然有将它们直接放入POM的诱惑。Hi,感谢您的回答。事实上,我正在使用一个相当大的(大约300行代码)grunt配置。我想知道的是,对于maven来说,将maven exec与grunt一起使用是否是一个好的实践。您能将pom.xml文件与
块一起发布吗?老实说,我不知道这是否是一个好的实践,但我就是这么做的。xml更像这样:org.apache.maven.plugins maven antrun plugin 1.5这是windows特有的吗?我在上面看到了“osfamily”,但我希望能够运行这个操作系统不可知论者——这可能吗?@BlondCode这篇文章有点老了,javascript生态系统中的事情进展得很快^!在国际海事组织,目前最好的解决方案是克里斯蒂安·乌尔布里奇列出的第一个解决方案。如果Grunt不能在你的机器上工作,试试Gulp(它似乎赢得了与Grunt的比赛),maven前端插件允许你使用它。这里不需要使用ant,maven exec插件
@echo off
set arg1=%1
set arg2=%2
C:\Progra~1\nodejs\npm.cmd %arg1% %arg2%
<build>
<plugins>
<plugin>
<groupId>com.seovic.maven.plugins</groupId>
<artifactId>npm-maven-plugin</artifactId>
<version>1.0.4</version>
<extensions>true</extensions>
</plugin>
[...]
</plugins>
</build>
"scripts":
{
"package": "npm pack",
[...]
}