deployment - Heroku - 我可以从 Procfile 调用 Maven 吗?

标签 deployment maven heroku

我正在研究 Heroku 作为一个平台,并试图让一个基本的 Java webapp 在它上面运行。 webapp 已经使用 Maven 构建和运行(使用 Tomcat 和 cargo-maven-plugin),所以我认为这应该是一件轻而易举的事,因为 Heroku 使用 Maven 来管理其安装/部署任务。

然而,情况并非如此,因为我无法真正启动它。我的 Procfile其中包含以下内容:

web: sh ./startServer-heroku.sh

startServer-heroku.sh只是:
mvn clean install cargo:start -Dcargo.maven.wait=true

当我使用 foreman start 在本地测试时,这很好用命令,如 Heroku 教程文档中所述。但是当我在实际的 Heroku 服务器上尝试它时,我收到以下日志消息:
2011-11-09T02:30:27+00:00 heroku[web.1]: State changed from created to starting 
2011-11-09T02:30:27+00:00 heroku[slugc]: Slug compilation finished 
2011-11-09T02:30:33+00:00 heroku[web.1]: Starting process with command `sh ./startServer-heroku.sh` 
2011-11-09T02:30:33+00:00 app[web.1]: ./startServer-heroku.sh: 1: mvn: not found 
2011-11-09T02:30:33+00:00 heroku[web.1]: Process exited 
2011-11-09T02:30:34+00:00 heroku[web.1]: State changed from starting to crashed

看来mvn在系统的 PATH 上找不到,所以命令失败。

是否可以调用 mvn来自 Heroku Procfile ?是否有任何地方有明确的命令列表,这些命令在 Procfile 中可用和不可用。 ?

最佳答案

Maven 不在部署到 dynos 的 slug 中。它仅在编译时可用。处理此问题的一种选择是使用 appassembler-maven-pluginjar打包生成启动脚本:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory> 
                <programs>
                    <program>
                        <mainClass>foo.Main</mainClass>
                        <name>webapp</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

然后是Procfile将是:
web: sh target/bin/webapp

另一种选择是 maven-dependency-pluginwar包装:
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.mortbay.jetty</groupId>
                                <artifactId>jetty-runner</artifactId>
                                <version>7.5.3.v20111011</version>
                                <destFileName>jetty-runner.jar</destFileName>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Procfile的:
web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war

关于deployment - Heroku - 我可以从 Procfile 调用 Maven 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8060158/

相关文章:

asp.net - 推荐的 Azure 开发-测试-部署策略是什么?

excel - 部署 Excel 插件

jdbc - 如何在heroku中使用嵌入式tomcat配置数据源

java - 如何在基于maven的项目中附加DLL文件

java - Eclipse 项目无法识别 Swagger Codegen Artifact

python - 连接中断 : IncompleteRead(0 bytes read) when sending request to Django on Heroku

ruby-on-rails - Heroku 上的 Rails 3.1 值得吗?

ruby-on-rails - 使用 Passenger 和 Nginx 将 Rails 应用程序部署到子 URI?

deployment - 未安装发布所需的网络发布扩展

android - 在构建期间替换 color.xml 和图像