我创建了一个maven项目,我已经写了几个星期的应用程序,并希望最终运行它...但我不能。
执行我的.jar时,我得到以下堆栈跟踪:
C:\Users\MyUser\.m2\repository\com\myCompany\MyApp\
0.0.1-SNAPSHOT> java -Dconfigfile=config.xml -jar MyApp-0.0.1-SNAPSHOT.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/configuration/ConfigurationException
at com.mycompany.connector.DBConnector.reloadDBSettings(DBConnector.java:23)
at com.mycompany.connector.DBConnector.<clinit>(DBConnector.java:16)
at com.mycompany.connector.DBConnectorFactory.createDBConnector(DBConnectorFactory.java:17)
at com.mycompany.service.MyAppService.<clinit>(MyAppService.java:38)
at com.mycompany.main.MyAppMain.init(MyAppMain.java:13)
at com.mycompany.main.MyAppMain.main(MyAppMain.java:8)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.configuration.ConfigurationException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
org.apache.commons.configuration.ConfigurationException被导入到类中,我将Maven设置为将其用作依赖项。我做错了什么?
BTW:这是我的reloadDBSettings方法:
import java.io.FileNotFoundException;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
public final class ConfigurationHandler {
private static XMLConfiguration config;
/**
* to reload Configuration-File if necessary
*/
public static void reloadConfig() throws FileNotFoundException {
try {
config = new XMLConfiguration(System.getProperty("configfile"));
} catch (ConfigurationException e) {
throw new FileNotFoundException("Es wurde keine Konfiguration geladen - Überprüfen Sie die Systemvariable 'configfile'(" + e.getMessage() + ")");
}
}
}
答案 0 :(得分:2)
java.lang.ClassNotFoundException
表示您的shell中的org.apache.commons.configuration.ConfigurationException
变量中没有$CLASSPATH
,并且在命令行上运行java
命令不是与通过Maven运行/编译相同。
答案 1 :(得分:2)
使用exec:java。 Maven将在类路径中包含所有必需的类。
添加配置(在pom.xml中的<plugins>
下):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<arguments>
<argument>-Dconfigfile=config.xml</argument>
</arguments>
<mainClass>com.tele2.main.MyAppMain</mainClass>
</configuration>
</plugin>
通过mvn exec:java
答案 2 :(得分:1)
ClassNotFoundException
表示JVM无法在类路径中找到该类。这与NoClassDefFoundError
不同,这意味着找不到该类使用的类(不是类本身)。
有两种方法可以解决这个问题:
将所有相关jar文件添加到文件夹,将其添加到JVM类路径并使用以下命令运行主类:
java -cp .\dependency\*;MyApp-0.0.1-SNAPSHOT.jar.jar com.myCompany.MyApp.Main
并且为了将所有依赖项放入文件夹,您可以使用maven dependencies plugin maven-dependency-plugin
使用maven程序集插件maven-assembly-plugin
。这个插件会将所有相关的jar文件捆绑到一个signle jar文件中,这样你就可以像执行它一样执行它。但是,有时此方法不适用于使用大量库的较大应用程序。罐子可能会相互冲突,因此您可能需要自己解决依赖关系或使用Tattletale maven插件为您解决。
注意:在第一种情况下,Tattletale也可以很好地解决冲突。