我正在尝试在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 库。
到目前为止,一切都很好。我在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上已部署的代码以查看有效部署的代码?
答案 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打开来浏览您的应用。