线程“main”中的异常java.lang.NoClassDefFoundError(Maven项目)

时间:2015-09-17 09:42:41

标签: java maven apache-camel maven-3

我尝试像java -jar camel-blueprint-1.0.0-SNAPSHOT.jar这样执行我的应用 ('camel-blueprint-1.0.0-SNAPSHOT.jar'是maven projet),我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/camel/main/Main
at com.mycompany.camel.blueprint.MainExample.boot(MainExample.java:19)
at com.mycompany.camel.blueprint.MainExample.main(MainExample.java:12)
Caused by: java.lang.ClassNotFoundException: org.apache.camel.main.Main
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more

这是主要课程:

package com.mycompany.camel.blueprint;

import org.apache.camel.main.Main;
import org.apache.log4j.BasicConfigurator;

public class MainExample {
    private Main main;   

    public static void main(String[] arguments) throws Exception {
        MainExample example = new MainExample();
        example.boot();
        BasicConfigurator.configure();
    }

    public void boot() throws Exception { 
        // create a Main instance       
        main = new Main(); 
        main.enableHangupSupport();
        System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");      
        main.run(); 
    } 
}

我找不到错误。 我该如何解决这个问题?

这是pom.xml

2 个答案:

答案 0 :(得分:0)

您需要在jar的mainfest中指定主类或指定要运行的类:

java -cp camel-blueprint-1.0.0-SNAPSHOT.jar com.mycompany.camel.blueprint.Main

答案 1 :(得分:0)

您创建的是可执行JAR文件,该文件依赖于其他(外部)JAR文件。这通常不是一个好主意。但是,如果要使其工作,则在创建JAR文件时,需要安排其清单中具有适当的ClassPath属性。 JAR文件规范说明了这一点:

  

“Class-Path:此属性的值指定此应用程序或扩展所需的扩展或库的相对URL .URL由一个或多个空格分隔。应用程序或扩展类加载器使用该值此属性用于构建其内部搜索路径。“

但有一个问题。 URL相对于可执行JAR文件的位置进行解析。如果实际的外部JAR不在清单中指定的预期位置,那么主JAR将不会启动。