![](/img/trans.png)
[英]java.lang.ClassNotFoundException when running a jar and its dependency is in the same directory
[英]java.lang.ClassNotFoundException when running java -jar
我正在使用ant來構建我的build.xml
文件,它編譯好了,但是當通過“ java -jar my_jar.jar
”運行生成的jar時獲得運行時java.lang.NoClassDefFoundError
。 這似乎出現了很多,但沒有相關問題的解決方案對我有用。
我的javac
類路徑只包含“ /usr/local/lib/libthrift.jar
”,主.java
文件導入了一堆thrift包,如org.apache.thrift.transport.TTransportException
。
當我嘗試通過以下方式運行程序時:
java -jar MyClass.jar
,我收到錯誤:
Exception in thread "main" **java.lang.NoClassDefFoundError**: org/apache/thrift/transport/TTransportException
Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransportException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: **MyClass**. Program will exit.
這是迄今為止我嘗試過的不起作用的東西:
在命令行上添加一個標志,如“java -cp /usr/local/lib/libthrift.jar
-jar my_jar.jar
”,結果與上面的錯誤相同
在我的jar的manifest>
標簽中添加<attribute name="Class-Path" value="./:/usr/local/lib/libthrift.jar"/>
,結果與上面的錯誤相同
將-Xbootclasspath/a:/usr/local/lib/libthrift.jar:./
到java命令行。 它解決了第一個錯誤,但出現了不同的錯誤:
線程“main”中的異常java.lang.NoClassDefFoundError:org / apache / log4j / Logger atg.apache.thrift.transport.TServerSocket。<clinit>(TServerSocket.java:36)位於MyClass的MyClass.start(未知來源) .main(未知來源)
編輯:
如果我注釋掉實例化缺少的類但保留導入的代碼,代碼執行正常。
編輯:
我將我的java類移動到服務器並使用manifest屬性中的服務器引用MainClass,但這並沒有修復任何問題。
Could not find the main class: MyClass
該錯誤似乎與您的MANIFEST
有關:
Class-Path
:請參閱此HowTo 有罐子的最佳解決方案是嘗試將所需的罐子包含在清單聲明中。
Manifest-Version: 1.0
Class-Path:
customer_client.jar
mailer_client.jar
signon_client.jar
看這個HowTo :
<target name="jar" depends="compile">
<delete file="hello.jar"/>
<delete file="MANIFEST.MF"/>
<manifest file="MANIFEST.MF">
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="howto.Hello"/>
</manifest>
<jar destfile="hello.jar"
basedir="."
includes="**/*.class"
manifest="MANIFEST.MF"
/>
</target>
所述<attribute name="Main-Class" value="howto.Hello"/>
需要指定的全路徑(包) MainClass
,不只是MainClass
。
如果您的主類在默認包( 未命名的包 )中,我不確定它是否可以由加載器引用(請參閱此SO問題 )
因此,將JarRunner
移動到一個包中,並在<attribute name="Main-Class" value="myPackage.JarRunner"/>
元素中正確聲明它。
您需要在清單文件中指定類路徑中所需的所有其他jar,然后才能執行java -jar my-test.jar,這里是我的一個清單文件的副本。 通過清單中的所有這些條目,我可以指定java -jar db_field_cleaner.jar
並將所有其他jar內聯到類路徑中:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: James B
Build-Jdk: 1.6.0_01
Package: com.blah.dbfieldcleaner
Specification-Title: db_field_cleaner
Specification-Version: 2.5.7-SNAPSHOT
Implementation-Title: db_field_cleaner
Implementation-Version: 2.5.7-SNAPSHOT
Implementation-Vendor-Id: com.blah.dbfieldcleaner
Implementation-Vendor:
Main-Class: com.blah.dbfieldcleaner.main.Main
mode: development
url: ..\..\db_field_cleaner\target\site
Class-Path: log4j-1.2.14.jar cygna_commons-2.5.7-SNAPSHOT.jar mail-1.4
.jar activation-1.1.jar jdic-0.9.5.jar jdic_native-0.9.5.jar jdic_plu
s-0.2.2.jar jdic_plus_native-0.2.2.jar jtds-1.2.2.jar xstream-1.3.1.j
ar xpp3_min-1.1.4c.jar commons-net-2.0.jar text_processing-2.5.7-SNAP
SHOT.jar
或者,使用Maven,它可以更好地加載這種東西!
您自己給出了答案:-)將所有jar添加到運行時類路徑中。如前所述* .jar解決了一個問題,但記錄器無法找到,因此將log4j.jar添加到路徑中。 基本上,這個想法是添加運行到classpath所需的所有jar。
這是正在發生的問題,
如果JAR文件是從“C:\\ java \\ apps \\ appli.jar”加載的,並且您的清單文件具有Class-Path:引用“lib / other.jar”,則類加載器將查看“C:\\ java” \\ apps \\ lib \\“for”other.jar“。 它不會查看JAR文件條目“lib / other.jar”。
解:-
打開終端,為你的jar提供正確的路徑並使用這個命令java -jar abc.jar運行它
現在將會發生的事情是類加載器將在引用的JARS的正確文件夾中查找,因為現在它們存在於包含應用程序JAR的同一文件夾中。現在沒有拋出“java.lang.NoClassDefFoundError”異常。
這對我有用...希望它對你有用!!!
可以在此處找到java
的命令行選項。
-jar
和-cp/-classpath
選項是互斥的。 -jar
選項需要使用清單,並且應在此文件中列出依賴關系的相對路徑。 但實質上,清單是一種可選機制 - 您可以在引導時從外部指定所需信息。 如果清單導致您出現問題,請不要使用清單。
我會測試你是否已使用如下命令找到所有依賴項:
java -cp /usr/local/lib/libthrift.jar:my_jar.jar MyClass
請注意,即使運行時可能需要的所有類都不存在,編譯器也可能成功編譯您的類。 如果存在類的直接依賴性,編譯將成功。 創建二進制文件不需要依賴項的依賴項,編譯器也不會不必要地檢查它們。
有關org/apache/log4j/Logger
的消息表明您對log4j缺少依賴性。 有必要將此庫添加到類路徑中。 檢查Thrift庫的文檔以確定其依賴性。
清單文件中的類路徑引用是相對引用。 只是為了調試,您可能希望將所有罐子復制到與my_jar.jar相同的位置並再次嘗試。
您可以嘗試將jar添加到服務器的域中。 我遇到了類似的問題,當我在glassfish上運行時,這對我有用。 我會得到那些未找到的例外。 Eclipse認識到它並且編譯得很好,但是當在服務器上運行時它無法找到該文件。 嘗試將其添加到服務器安裝到的任何lib目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.