-1

我创建了一个 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 将其用作依赖项。我究竟做错了什么?

顺便说一句:这是我的 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() + ")");
            }
    }
}
4

3 回答 3

2

Ajava.lang.ClassNotFoundException表示您的 shellorg.apache.commons.configuration.ConfigurationException中没有变量,并且在命令行上运行命令与通过 Maven 运行/编译不同。$CLASSPATHjava

于 2011-11-07T14:44:18.340 回答
2

使用exec:java。Maven 将在类路径中包含所有必要的类。

添加配置(<plugins>在你的 pom.xml 中):

<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

于 2011-11-07T15:29:09.590 回答
1

ClassNotFoundException意味着 JVM 在您的类路径中找不到该类。这与NoClassDefFoundError未找到该类使用的类(不是类本身)不同。

有两种方法可以解决这个问题:

  1. 将所有依赖的 jar 文件添加到文件夹中,将其添加到 JVM 类路径并使用以下命令运行主类:

    java -cp .\dependency\*;MyApp-0.0.1-SNAPSHOT.jar.jar com.myCompany.MyApp.Main

    并且为了将所有依赖项放入一个文件夹中,您可以使用 Maven 依赖项插件maven-dependency-plugin

  2. 使用 Maven 程序集插件maven-assembly-plugin。这个插件会将所有依赖的 jar 文件捆绑到一个 signle jar 文件中,这样你就可以用同样的方式执行它。但是,有时这种方法不适用于使用大量库的大型应用程序。jar 可能会相互冲突,因此您可能需要自己解决依赖关系或使用Tattletale maven 插件为您解决它。

注意:Tattletale 在第一种情况下也可以很好地解决冲突。

于 2011-11-07T15:34:36.320 回答