Java 如何使用maven部署node.js应用程序?

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安装(即从

我们团队的大多数成员都是java开发人员,因此整个构建/部署/依赖关系管理系统都是在maven之上构建的。我们使用CI,因此每个构建过程都运行单元测试(w.karma和phantomJS用于前端,jasmine节点用于后端)。我已经为此配置了karma maven插件

这并不能解决在构建时从package.json下载node.js依赖项的问题。我需要在现有环境中部署我的node.js/express应用程序,因此最佳方案是:

  • 从回购中提取(使用maven build自动完成)
  • npm安装
    (即从节点包注册表下载依赖项)
  • 运行测试
  • 我试图为maven找到一个nodejs包,但老实说,作为一名node.js开发人员,在选择合适的工具时,我并不觉得很自信,因为我无法区分一个坏的maven插件和一个好的maven插件

    也许使用shell插件并从终端调用
    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",
      [...]
      }