编程语言
首页 > 编程语言> > 运行java -jar时的java.lang.ClassNotFoundException

运行java -jar时的java.lang.ClassNotFoundException

作者:互联网

我正在使用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”,结果与上面的错误相同
> add& lt; attribute name =“Class-Path”value =“./:/usr/local/lib / libthrift.jar”/>在我的jar的清单里面>标签,结果与上面的错误相同
>将-Xbootclasspath / a:/usr/local/lib/libthrift.jar:./添加到java命令行.它解决了第一个错误,但出现了不同的错误:

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

编辑:

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

编辑:

我将我的java类移动到服务器并使用manifest属性中的服务器引用MainClass,但这并没有修复任何问题.

解决方法:

Could not find the main class: MyClass

该错误似乎与您的MANIFEST有关:

>可能没有完整的类路径Class-Path:请参阅this HowTo

The best solution when you have a jar is to try to include the required jars into the manifest declaration.

Manifest-Version: 1.0 
Class-Path:  
 customer_client.jar  
 mailer_client.jar  
 signon_client.jar 

>或者可能没有在’my_jar.jar’中充分定义MainClass.

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

如果你的主类在默认包(unnamed package)中,我不确定加载器是否可以引用它(参见SO question)
因此,将您的JarRunner移动到一个包中,并在< attribute name =“Main-Class”value =“myPackage.JarRunner”/>中正确声明它.元件.

标签:java,ant,build-xml
来源: https://codeday.me/bug/20190715/1463975.html