我在Heroku上部署应用程序时遇到了麻烦,我创建了最简单的应用程序:它包含两个文件:index.jsp
和SomeServlet.java
。
我有以下项目结构:
TestDeployApp
--WEB-INF
--classes
--com
--web
--SomeServlet.class
--web.xml
--src
--com
--web
--SomeServlet.java
--target
--classes
--com
--web
--SomeServlet.class
--dependency
--webapp-runner.jar
--maven-archiver
--pom.properties
--gs-serving-web-content-0.1.0.jar
--gs-serving-web-content-0.1.0.jar.original
--index.jsp
--pom.xml
--Procfile
--TestDeployApp.war
的index.jsp :
<html>
<head></head>
<body>it's a jsp</body>
</html>
SomeServlet.java :
package com.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class SomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
java.util.Date today = new java.util.Date();
out.println("<html><body><h1>" + today + "</h1></body></html");
}
}
的web.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>TestDeployApp</display-name>
<description>
This is a simple web application with a source code organization
based on the recommendations of the Application Developer's Guide.
</description>
<context-param>
<param-name>adminPlanet</param-name>
<param-value>Earth</param-value>
</context-param>
<servlet>
<servlet-name>SomeServlet</servlet-name>
<servlet-class>com.web.SomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SomeServlet</servlet-name>
<url-pattern>/SomeServlet.do</url-pattern>
</servlet-mapping>
</web-app>
的pom.xml :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-serving-web-content</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<properties>
<java.version>1.7</java.version>
<start-class>com.web.SomeServlet</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<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>com.github.jsimone</groupId>
<artifactId>webapp-runner</artifactId>
<version>8.0.30.2</version>
<destFileName>webapp-runner.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<defaultGoal>install</defaultGoal>
</build>
</project>
Procfile :
web: java $JAVA_OPTS -cp target/classes/:target/dependency/* com.web.SomeServlet
我正在做什么来部署它:
git init
git add
git commit -m "first"
git push heroku master
heroku open
浏览器窗口打开后,我看到An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details.
错误。
在日志中:
2018-02-10T20:16:50.864803+00:00 app[web.1]: Error: Could not find or load main class com.web.SomeServlet
2018-02-10T20:16:56.052981+00:00 heroku[web.1]: Starting process with command `java $JAVA_OPTS -cp target/classes/:target/dependency/* com.web.SomeServlet`
2018-02-10T20:16:58.391978+00:00 heroku[web.1]: Process exited with status 1
2018-02-10T20:16:58.419611+00:00 heroku[web.1]: State changed from starting to crashed
2018-02-10T20:16:58.099331+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2018-02-10T20:16:58.103410+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -Dfile.encoding=UTF-8
2018-02-10T20:16:58.297295+00:00 app[web.1]: Error: Could not find or load main class com.web.SomeServlet
2018-02-10T20:17:41.405484+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=testdeployapp-mine.herokuapp.com request_id=c217c572-e92a-409d-b8c8-27e57bb20013 fwd="178.217.106.173" dyno= connect= service= status=503 bytes= protocol=https
2018-02-10T20:17:42.829328+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=testdeployapp-mine.herokuapp.com request_id=21b0276c-ef8c-41b0-92c1-86c15d727aad fwd="178.217.106.173" dyno= connect= service= status=503 bytes= protocol=https
2018-02-10T20:17:58.784267+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=testdeployapp-mine.herokuapp.com request_id=a303e9da-e9d5-4d15-bd78-d3de2b3b3240 fwd="178.217.106.173" dyno= connect= service= status=503 bytes= protocol=https
2018-02-10T20:18:12.634882+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=testdeployapp-mine.herokuapp.com request_id=ce575c1b-d1ab-4f83-aaf7-a95cab4c7752 fwd="178.217.106.173" dyno= connect= service= status=503 bytes= protocol=https
我还尝试使用java -jar webapp-runner.jar application.war
命令,但我在cmd中遇到Unable to access jarfile webapp-runner.jar
错误。
欢迎任何建议。我尝试了 Procfile 的所有变体,我找不到,似乎没什么用。
答案 0 :(得分:3)
基本上,您正在混合war
或&#34; Web应用程序&#34;部署jar
或&#34;可执行文件&#34;部署。对于第一个,您需要一个Web应用程序,它可以像Tomcat一样部署在Servlet容器上,并以.war
格式部署。对于此类部署,Heroku将要求您通过向Procfile提供target/dependency/webapp-runner.jar
来运行您的应用程序。所以它背后的想法是让Heroku运行servlet容器并部署你的.war
文件。
因此,您需要将Procfile更改为
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
但是我看到你正在使用Spring Boot包,它使用嵌入式servlet容器创建一个jar
打包的可执行文件。但是你没有任何可以启动spring boot应用程序的主类。所以在你的情况下,只需添加一个spring boot主类,如:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后将Procfile更改为
web: java -jar target/your-app-name.jar
因此,要么将应用程序类型从Spring Boot更改为常规Web应用程序,请使用Heroku web runner或添加Spring Boot入门主类。
答案 1 :(得分:0)
看起来你的java类路径不正确?
java $ JAVA_OPTS -cp target / classes / :target / dependency / * com.web.SomeServlet
答案 2 :(得分:0)
当您尝试访问该应用时,您的端口号是否正确?检查一次默认端口。可能是localhost:8080
或其他你不知道的事情。