Java 通过命令行向jar文件添加外部依赖项

Java 通过命令行向jar文件添加外部依赖项,java,maven,intellij-idea,jar,Java,Maven,Intellij Idea,Jar,在阅读了问题之后,我成功地运行了一个.jar文件,该文件的外部依赖项位于jar文件中: /usr/lib/jvm/java-8-jdk/bin/java -classpath /usr/local/bin/kiaragen.jar:/home/kiara/AppLab/KIARA/kiaragen/src/main/resources/org/fiware/kiara/generator/idl/templates/*:/usr/lib/jvm/java-8-jdk/jre/lib/*:/hom

在阅读了问题之后,我成功地运行了一个.jar文件,该文件的外部依赖项位于jar文件中:

/usr/lib/jvm/java-8-jdk/bin/java -classpath /usr/local/bin/kiaragen.jar:/home/kiara/AppLab/KIARA/kiaragen/src/main/resources/org/fiware/kiara/generator/idl/templates/*:/usr/lib/jvm/java-8-jdk/jre/lib/*:/home/kiara/AppLab/KIARA/kiaragen/lib/*  org.fiware.kiara.generator.kiaragen
其中,/usr/local/bin/kiaragen.jar是要执行的文件。现在,我正在尝试运行一个不同的版本,该版本取决于.class文件:

/home/kiara/AppLab/KIARA/IDL-Parser/target/classes/com/eprosima/idl/parser/exception/ParseException.class
将文件添加到类路径:

/usr/lib/jvm/java-8-jdk/bin/java -classpath /usr/local/bin/kiaragen-0.2.0.jar:/home/kiara/AppLab/KIARA/IDL-Parser/target/classes/com/eprosima/idl/parser/exception/ParseException.class:/home/kiara/AppLab/KIARA/kiaragen/src/main/resources/org/fiware/kiara/generator/idl/templates/*:/usr/lib/jvm/java-8-jdk/jre/lib/*:/home/kiara/AppLab/KIARA/kiaragen/lib/*  org.fiware.kiara.generator.kiaragen
给出以下例外情况:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/eprosima/idl/parser/exception/ParseException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.eprosima.idl.parser.exception.ParseException
    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)
    ... 7 more
为什么?

.jar的清单文件与以前相同:

$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Main-Class: org.fiware.kiara.generator.kiaragen

如何将.class文件添加到类路径?

您不了解类路径是什么。类路径是jar文件和目录的集合,Java在其中查找类(以及类加载器加载的其他资源)

如果程序使用类
com.foo.Bar
,则类路径中必须包含的是而不是文件
/somedirectory/com/foo/Bar.class
。类路径中必须包含目录
/somedirectory
。或者包含该类的jar文件

然后,类装入器将从该基本目录或jar文件中查找与类名对应的文件:

com.foo.Bar --> com/foo/Bar.class
这很重要,因为它允许Java一次访问数百个类,而不必在类路径中列出数百个类文件。在类路径中,您只需要包含数百个类的目录或jar


还要注意,
/usr/lib/jvm/java-8-jdk/jre/lib/*
也不能在类路径中。Java知道在哪里可以找到JRE本身的库。

您不了解类路径是什么。类路径是jar文件和目录的集合,Java在其中查找类(以及类加载器加载的其他资源)

如果程序使用类
com.foo.Bar
,则类路径中必须包含的是而不是文件
/somedirectory/com/foo/Bar.class
。类路径中必须包含目录
/somedirectory
。或者包含该类的jar文件

然后,类装入器将从该基本目录或jar文件中查找与类名对应的文件:

com.foo.Bar --> com/foo/Bar.class
这很重要,因为它允许Java一次访问数百个类,而不必在类路径中列出数百个类文件。在类路径中,您只需要包含数百个类的目录或jar

还要注意,
/usr/lib/jvm/java-8-jdk/jre/lib/*
也不能在类路径中。Java知道在哪里可以找到JRE本身的库