-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

java.lang.ClassNotFoundExceptionつまり、シェルの変数にが含まorg.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

ClassNotFoundExceptionJVM がクラスパスでクラスを見つけられないことを意味します。NoClassDefFoundErrorこれは、そのクラスが使用するクラスが見つからない (クラス自体ではない) という意味とは異なります。

この問題を解決するには、次の 2 つの方法があります。

  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 ファイルにバンドルするため、同じ方法で実行できます。ただし、特に多くのライブラリを使用する大規模なアプリケーションでは、この方法が機能しないことがあります。jar は互いに競合する可能性があるため、依存関係を自分で解決するか、Tattletale maven プラグインを使用して解決する必要があります。

注: Tattletale は、最初のケースで競合を解決するのにも適しています。

于 2011-11-07T15:34:36.320 に答える