簡體   English   中英

運行java -jar時的java.lang.ClassNotFoundException

[英]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 
  • 或者可能沒有充分定義'my_jar.jar'中的MainClass。

這個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”。

解:-

  1. 右鍵單擊項目,選擇“導出”。
  2. 選擇Java Folder並在其中選擇Runnable JAR File而不是JAR文件。
  3. 選擇正確的選項,然后在Library Handling部分中選擇第3個選項,即(將所需的庫復制到生成的JAR旁邊的子文件夾中)。
  4. 單擊“完成”,將在指定位置創建JAR以及包含清單文件中提到的JARS的文件夾。
  5. 打開終端,為你的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相同的位置並再次嘗試。

參考: http//www.rgagnon.com/javadetails/java-0587.html

您可以嘗試將jar添加到服務器的域中。 我遇到了類似的問題,當我在glassfish上運行時,這對我有用。 我會得到那些未找到的例外。 Eclipse認識到它並且編譯得很好,但是當在服務器上運行時它無法找到該文件。 嘗試將其添加到服務器安裝到的任何lib目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM