0

私は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で失敗します。

答えて

0

私は回避策があり、問題の原因を知っていますが、詳細をすべて把握しておらず、誰かがこれについてコメントしたり、回答を詳しく述べたりすることを願っていません。

この問題は、私はmvn spring-boot:runを使用して、春・ブート組み込みTomcatサーバーを実行するために使用spring-boot-maven-plugin、ある原因の事。このプラグインは.jarファイル上の何か、おそらくマニフェストを変更するようですか?

このプラグインを削除するには、mvn clean installを実行してください。ローカルのリポジトリにインストールされている.jarが正しく動作します。小さなプロジェクトでmvn compileを実行します。その後、大きなプロジェクトにプラグインを追加して実行してくださいmvn spring-boot:run

プラグインが変更され、その結果、パッケージが存在しない.jarが存在しない場合、パッケージ名は変更されますか?

spring-boot-maven-pluginの有無にかかわらずコンパイルする方法がある場合、私は別のビルド(プラグインの有無にかかわらず)を変更する必要はありません。それがより良い解決策になるでしょう。