私はStackOverflowで多くの提案を試みて、3日間にわたってsetupとpom.xmlの多くの組み合わせでテストしましたが、どれも動作しません。助けてください。Maven Execプラグイン、ClassLoader ClassNotFoundException
私は多くの依存関係、春起動、休止状態などの大きなプロジェクトを開始しました。次に大きなプロジェクトからいくつかのクラスをインポートして使用する別の小型コンソールプロジェクトを作成します。彼らは親子プロジェクトではありません。私がしているのは、このように子プロジェクトのpomに<dependency/>
を追加することだけです。 P.P.大きなプロジェクトには<parent/>
spring-boot-starter-parentがあり、spring-boot-maven-pluginを使用します。
<dependency>
<groupId>myGroup</groupId>
<artifactId>bigProject</artifactId>
<version>1.0.1</version>
</dependency>
これはのM2eでのEclipse上で動作し、私は、Javaアプリケーションと小さなプロジェクトの作品「として実行」を使用します。 しかし、GUIとEclipseを使用していない私のlinux VM上で、これらのプロジェクトをアップロードして実行する必要があります。
それから読んだ後、私は小さなプロジェクトを実行するためにmaven execプラグインを使ってみます。私の手順: 1.大きなプロジェクトでmvn clean install
を実行し、それが/.m2ローカルリポジトリに表示されることを確認しました。 2.小さなプロジェクトでmvn compile
を実行します。 3.小さなプロジェクトでを実行します。 手順2で失敗します。小さなプロジェクトスローパッケージxxxのクラスにあるimport ...
が存在しません。 mavenはコンパイルエラーで失敗します。
次に、問題を単純化しようとしています。私は1つのクラス、myLibとHelloWorldコンソールアプリケーションで2つのテストプロジェクトを作成し、次にmyLib依存性(pom)を追加します。 HelloWorldプロジェクトは、myLibパッケージのクラスからメッセージを出力します。手順1〜3を実行します。
public class App
{
public static void main(String[] args)
{
//SystemLog from big project, does not work
//SystemLog log = new SystemLog();
//log.setValue("test value");
//System.out.println(log.getValue());
//CustomMessage from myLib, works fine
CustomMessage cm = new CustomMessage();
cm.setTheMessage("custom message");
System.out.println(cm.getTheMessage());
System.out.println(CustomMessage.defaultMsg);
}
}
小さなプロジェクトののpom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>dependOnOthers</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dependOnOthers</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>test</groupId>
<artifactId>myLibrary</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com</groupId>
<artifactId>bigproject</artifactId>
<version>1.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.5.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<includePluginDependencies>true</includePluginDependencies>
<mainClass>test.dependOnOthers.App</mainClass>
<!-- <arguments> <argument>argument1</argument> </arguments> -->
<!-- <arguments> <argument>-classpath</argument> <argument>target/lib/bigproject-1.0.1.jar</argument>
</arguments> -->
</configuration>
</plugin>
</plugins>
</build>
</project>
それから私は、HelloWorldのを使用してログメッセージを印刷し、それはステップ2を通過し、MVNコンパイルしようと、大きなプロジェクトへの参照を追加しますが、私はやるときステップ3、mvn exec:java、java.lang.ClassLoader.loadClass()
throw ClassNotFoundException私がSystemLog()インスタンスを新規に作成した行で、大きなプロジェクトで定義されているクラス。
要約したものです。 目標:別のプロジェクトに依存しているMavenのexecのプラグインを使用して、コンソールアプリケーションを実行しようと、それはSystemLogクラスが休止状態の注釈付きモデルクラスである/.m2 ローカルレポにインストールされています。 1.小さなプロジェクトは大きなプロジェクトに依存し、mvnコンパイルに失敗し、パッケージが存在しません。 2. HelloWorldはmyLibに依存しています。正常に動作します。 3. HelloWorldは大きなプロジェクトに依存し、実行時にClassNotFoundExceptionで失敗します。