如何使用Maven解决Heroku上的NoClassDefFoundError问题?

时间:2018-11-05 12:18:17

标签: java maven heroku noclassdeffounderror ormlite

我正在尝试在heroku上部署我的应用程序,并且在调用index.html页面时出现 NoClassDefFoundError 。错误日志如下所示:

    2018-11-04T19:13:02.080531+00:00 heroku[web.1]: Starting process with 
    command `java $JAVA_OPTS -cp target/classes:target/dependency/* 
    com.treslines.server.Server`

    2018-11-04T19:13:05.913978+00:00 app[web.1]: Setting 
    JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will 
    override them.

    2018-11-04T19:13:05.926232+00:00 app[web.1]: Picked up 
    JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 
    -Dfile.encoding=UTF-8

    2018-11-04T19:13:06.250733+00:00 app[web.1]: Error: A JNI error has 
    occurred, please check your installation and try again

    2018-11-04T19:13:06.250788+00:00 app[web.1]: Exception in thread 
    "main" java.lang.NoClassDefFoundError: com/j256/ormlite/support
    /ConnectionSource

    2018-11-04T19:13:06.250796+00:00 app[web.1]: at 
    java.lang.Class.getDeclaredMethods0(Native Method)

    2018-11-04T19:13:06.250799+00:00 app[web.1]: at 
    java.lang.Class.privateGetDeclaredMethods(Class.java:2701)

    2018-11-04T19:13:06.250801+00:00 app[web.1]: at 
    java.lang.Class.privateGetMethodRecursive(Class.java:3048)

    2018-11-04T19:13:06.250808+00:00 app[web.1]: at 
    java.lang.Class.getMethod0(Class.java:3018)

    2018-11-04T19:13:06.250810+00:00 app[web.1]: at 
    java.lang.Class.getMethod(Class.java:1784)

    2018-11-04T19:13:06.250812+00:00 app[web.1]: at ... 7 more

所以我理解了这个错误,我在本地的 target / dependency 文件夹中进行了查找,并且在 ormlite-core-5.1 ormlite-jdbc-5.1 库。

enter image description here

到目前为止,一切都很好。我在heroku上的proc文件如下所示:

    web: java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server

在我的maven pom.xml中,我具有以下配置:

...

    <dependency>
        <groupId>com.j256.ormlite</groupId>
        <artifactId>ormlite-core</artifactId>
        <version>5.1</version>
    </dependency>

    <dependency>
        <groupId>com.j256.ormlite</groupId>
        <artifactId>ormlite-jdbc</artifactId>
        <version>5.1</version>
    </dependency>

...

    <configuration>
                <descriptorRefs>
                    <!-- This tells Maven to include all dependencies -->
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.treslines.server.Server</mainClass>
                    </manifest>
                </archive>
            </configuration>

...

    <plugin>
            <groupId>com.heroku.sdk</groupId>
            <artifactId>heroku-maven-plugin</artifactId>
            <version>0.4.4</version>
            <configuration>
                <jdkVersion>1.8</jdkVersion>
                <!-- Use your own application name >>> heroku enforces lowcase names -->
                <appName>stocknews</appName>
                <processTypes>
                    <!-- Tell Heroku how to launch your application -->
                    <web>java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server</web>
                </processTypes>
            </configuration>
        </plugin>

该代码像魅力一样在本地主机上运行。我成功地将代码推送到了heroku,一切运行正常,maven构建成功,等等。但是,当我在命令cli上调用 heroku open 或在浏览器中键入URL时,会出现 NoClassDefFoundError

有人知道如何解决吗?是否可以访问heroku上已部署的代码以查看有效部署的代码?

2 个答案:

答案 0 :(得分:1)

首先更新heroku-maven-plugin。您使用的是0.4.4,但最新的版本是2.0.6:

<version>2.0.6</version>

答案 1 :(得分:1)

已解决

解决方案:关于spark java和heroku的两个教程都已过时。这些网站说您应该具有这样的processType:

...

    <web>java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server</web>

...

但是,在将其部署到Heroku上时,我拥有的 maven-assembly-plugin 并没有像以前那样创建 target / dependecy 文件夹。要解决此问题,必须包括缺少的依赖项,如下所示:

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
              <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>target/dependency/</outputDirectory>
                  <overWriteReleases>false</overWriteReleases>
                  <overWriteSnapshots>false</overWriteSnapshots>
                  <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
              </execution>
            </executions>
          </plugin>

在heroku上部署应用程序时,还有一个命令行可以查看和检查已部署的工件。 heroku run bash 之后,您可以键入 ls 来查看您部署的软件包是否正确。

与您只需要输入以下内容即可将其推送到您的heroku主服务器上: git push heroku master Maven将重新部署它,但是到那时,它将所有项目依赖项附加到文件夹目标/依赖性。现在,您可以调用 heroku打开来浏览您的应用。