【问题标题】:Heroku: The simplest application, could not find or load main classHeroku:最简单的应用程序,找不到或加载主类
【发布时间】:2017-10-07 21:12:21
【问题描述】:

在 Heroku 上部署我的应用程序时遇到问题后,我创建了最简单的应用程序:它包含两个文件:index.jspSomeServlet.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>

过程文件

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 变体,似乎没有任何效果。

【问题讨论】:

标签: java web-services jsp heroku deployment


【解决方案1】:

基本上,您将war 或“Web 应用程序”部署与jar 或“可执行”部署混合在一起。对于第一个,您需要有一个可以部署在 Tomcat 等 Servlet 容器上的 Web 应用程序和 .war 格式的包。对于这种类型的部署,Heroku 将要求您通过提供 target/dependency/webapp-runner.jarProcfile 来运行您的应用程序。所以它背后的想法是让 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 运行器,要么添加 Spring Boot starter 主类。

【讨论】:

    【解决方案2】:

    看起来您的 java 类路径不正确?

    java $JAVA_OPTS -cp target/classes/:target/dependency/* com.web.SomeServlet

    【讨论】:

      【解决方案3】:

      当您尝试访问应用程序时,您的端口号是否正确?检查一次您的默认端口。可能是localhost:8080 或其他您不知道的。

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 2016-08-12
        • 1970-01-01
        • 2019-04-28
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多