3

次のような単純な 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);

誰かがこれを達成する方法を提案できますか? どんなアイデアでも大歓迎です。

4

1 に答える 1

2

最後に、長い調査の後、チームリーダーの助けを借りて、解決策を見つけることができました. 実際には、spring-boot-maven プラグインによって作成された実行可能 jar 依存関係の問題です。私のスターター クラスは依存関係リストで Foo.java または Bar.java を見つけることができませんでした。これらの jar は実行可能な jar でもあるためです。最後に、foo-project および bar-project POM ファイルに次の行を追加しました。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>none</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

これにより、foo-project と bar-project jar が一般的なものになり、すべてが期待どおりに機能します。

これが、誰かが spring-boot-maven プラグインを使用するのに役立つことを願っています。

于 2016-10-06T11:38:32.610 に答える