次のような単純な Spring Boot クラスがあります。
@SpringBootApplication
public class Starter {
public static void main(String... args) {
if ("foo".equals(args[0])) {
SpringApplication.run(Foo.class, args);
} else if ("bar".equals(args[0])) {
SpringApplication.run(Bar.class, args);
}
}
}
Foo.java および Bar.java ファイルは、依存関係として現在の jar ファイル内にネストされ、@SpringBootApplication で注釈が付けられたメイン クラス ファイルです。jar ファイルの構造を以下に示します。
├───BOOT-INF │ ├───クラス │ │ ├────com │ │ │ └───アプリ │ │ │ └────スターター │ │ │ └────Starter.class | | | | | | │ │ └────構成 │ └───lib | | ├───tool1.jar | | | | └────Foo.java | | └────tool2.jar | | └───Bar.java ├───メタINF │ └───メイブン │ └───com.app.starter │ └───スターター └───組織 └───春のフレームワーク └───ブート └───ローダー ├───アーカイブ ├───データ ├───壷 └───ユーティリティ
これは、Starter.java を起動しようとしているときに Eclipse から正常に動作しますが、maven でプロジェクトをビルドしようとすると例外が発生します。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project starter: Compilation failure: Compilation failure:
[ERROR] /C:/Projects/Starter/src/main/java/com/app/starter/Starter.java:[6,19] cannot find symbol
[ERROR] symbol: class Starter
Starter POM ファイルからの抜粋を次に示します。
<project>
.....
<parent>
<groupId>com.app.myproject</groupId>
<artifactId>parent-tool</artifactId>
<version>1.0</version>
</parent>
<artifactId>starter</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.app.myproject</groupId>
<artifactId>foo-project</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.app.myproject</groupId>
<artifactId>bar-project</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
プロジェクト構造は次のようなものです。
親プロジェクトとしてアグリゲーター POM があり、親も spring-boot-starter として宣言されています。Foo、Bar、および Starter プロジェクトはすべて、親プロジェクトの子です。
spring-boot-maven-plugin でネストされたすべての依存関係を持つ単一のファット jar を作成したいと考えています。渡されたパラメーターに従って、スターターメインクラスから必要なプロジェクトを開始できるようにします。スプリングブーツで可能ですか?このようにクラスローダーを使用してFooとBarのメインメソッドを呼び出そうとしましたが、このアプローチは機能しません。クラスローディングが初めてなので、何か間違っている可能性があります。
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {new URL("tool1.jar")});
Class myClass = cl.loadClass("com.app.Foo");
Method mainMethod = myClass.getMethod("main");
Object myClassObj = myClass.newInstance();
Object response = mainMethod.invoke(myClassObj);
誰かがこれを達成する方法を提案できますか? どんなアイデアでも大歓迎です。