我有一个运行tomcat7和oracle JDK8的测试Ubuntu服务器,我正在尝试加载一些jar文件,这些jar文件将在未来的各种程序中使用。web和jvm程序。我意识到,当我测试将作为服务器后台进程运行的jar时,会出现问题,但当它运行时,我得到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: edu/illinois/sql/sqlConnection
at server.edu.illinois.xmlConverter.convertXML.run(Converter.java:27)
at server.edu.illinois.xmlConverter.Converter.main(Converter.java:13)
Caused by: java.lang.ClassNotFoundException: edu.illinois.sql.sqlConnection
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more我已经将我的jars和我的类添加到/shared/lib,catalina.properties知道要查看那里,并且在$JAVA_HOME/jre/lib中有符号链接。有没有人对为什么我在服务器上的jars中的自定义类没有正确加载有什么建议?另外,我用来生成错误的jar在eclipse中运行得很好。
这是一个与ClassNotFoundException/NoClassDefFoundError in my Java web application不同的问题,因为我相信我的jars位于正确的位置,并且我正在试图找出导致这些类无法加载的错误之处。
发布于 2014-07-10 04:44:33
不要修改您的JVM安装,这是不值得的。有一些众所周知的方法可以将JAR绑定到您的程序中:
对于作为可执行JAR的独立程序,请参见this answer
WEB-INF/lib中。Maven甚至会为你做到这一点。是的,相同的JAR将被复制。不,这真的很好。是的,有一些开销。是的,与修改后的JVM相比,好处确实是值得的(原因是我浪费了大约5个小时,试图找出为什么在java自动更新后,我的开发机器突然找不到我的类了……)。
发布于 2014-07-10 08:47:49
我可能没有很好地解释这一点,我仍然是java的新手,并且是自学的。然而,我确实想出了我的答案。Tassos和Thorbjørn提出了很好的观点,我会牢记这一点,特别是不要与/jre/lib或/jre/lib/etx打交道。但是,由于我不想将外部jar与runnable jar捆绑在一起,因此我找到了适合我的解决方案,因为我既在运行服务器,又在创建jar。
我将添加并创建一个自定义MANIFEST.MF,它将包含一个指向我放置通用jars的目录的Class-path:语句。
例如:
Manifest-Version: 1.0
Main-Class: server.edu.illinois.Main
Class-Path: /shared/lib/guava-17.0.jar /shared/lib/jcifs-1.3.17.jar /shared/lib/mysql-connector-java-3.1.14-bin.jar这样,我就可以只包含一次所需的外部jar,并在更新清单的jar时更新Eclipse中需要的任何内容。当tomcat执行公共类加载时,我仍然可以让它拾取库中的那些jars。当我明天回到我的开发机器上时,我会把符号链接从/jre/lib/ext中拉出来。
总体而言,我的jars一开始就没有正确加载,因为它们实际上不在类加载器正在查看的路径中。为了在不增加开销的情况下解决此问题,并且由于这些将是一次性程序,因此将目录添加到catalina的公共类加载器,并将jar路径添加到我的独立程序的清单中。
https://stackoverflow.com/questions/24659399
复制相似问题