我正在研究 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-plugin
和 jar
打包生成启动脚本:
<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-plugin
和 war
包装: <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/