После установки mvn я пытаюсь запустить main, но я получаю NoClassDefFoundError в ConfigurationException - PullRequest
0 голосов
/ 07 ноября 2011

Я создал проект 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() + ")");
            }
    }
}

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Использование 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

2 голосов
/ 07 ноября 2011

A java.lang.ClassNotFoundException означает, что в вашей оболочке нет переменной org.apache.commons.configuration.ConfigurationException в вашей $CLASSPATH, а выполнение команды java в командной строке не то же самое, что запуск / компиляция через Maven.

1 голос
/ 07 ноября 2011

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 в файл JAR Signle, чтобы вы могли выполнить его так же, как вы. Однако иногда этот метод не работает, особенно для больших приложений, которые используют много библиотек. Банки могут конфликтовать друг с другом, поэтому вам может потребоваться разрешить зависимости самостоятельно или использовать плагин Tattletale maven, чтобы решить его за вас.

Примечание: Tattletale также хорош для разрешения конфликтов в первом случае.

...