运行 java -jar 时出现 java.lang.ClassNotFoundException

2024-05-16

我正在使用 ant 来构建我的build.xml文件,它编译正常,但随后得到运行时java.lang.NoClassDefFoundError通过“运行生成的 jar 时java -jar my_jar.jar“。似乎这个问题出现了很多,但没有一个相关问题的解决方案对我有用。

我的类路径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”,结果和上面一样的错误

  • adding <attribute name="Class-Path" value="./:/usr/local/lib/libthrift.jar"/>在我的罐子里manifest>tag,结果和上面一样的错误

  • adding -Xbootclasspath/a:/usr/local/lib/libthrift.jar:./到java命令行。它解决了第一个错误,但出现了另一个错误:

    线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/log4j/Logger 在 org.apache.thrift.transport.TServerSocket.(TServerSocket.java:36) 在 MyClass.start(来源未知) 在 MyClass.main(来源不明)

EDIT:

如果我注释掉实例化缺失类的代码但保留导入,则代码执行正常。

EDIT:

我将我的 java 类移至服务器,并在清单属性中使用服务器引用 MainClass,但这并没有解决任何问题。


Could not find the main class: MyClass

该错误似乎实际上与您有关MANIFEST which:

  • 可能没有完整的类路径Class-Path: see 本指南 http://www.rgagnon.com/javadetails/java-0587.html

当您拥有 jar 时,最好的解决方案是尝试将所需的 jar 包含到清单声明中。

Manifest-Version: 1.0 
Class-Path:  
 customer_client.jar  
 mailer_client.jar  
 signon_client.jar 
  • 或者可能没有在“my_jar.jar”中充分定义 MainClass。

See 本指南 http://www.rgagnon.com/javadetails/java-0532.html:

<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>

the <attribute name="Main-Class" value="howto.Hello"/>需要指定完整路径(包)MainClass, 不只是MainClass.

如果您的主类位于默认包中(未命名的包 http://java.sun.com/docs/books/jls/second_edition/html/packages.doc.html#26639),我不确定它是否可以被加载器引用(参见这个所以问题 https://stackoverflow.com/questions/859603/java-is-there-a-tool-to-make-code-in-a-3rd-party-jar-forward-compatible-1-4)
所以移动你的JarRunner放入一个包中,并在<attribute name="Main-Class" value="myPackage.JarRunner"/>元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 java -jar 时出现 java.lang.ClassNotFoundException 的相关文章

随机推荐