У меня есть простой класс Spring загрузки, как это:Запуск основного класса внутри вложенной исполняемой баночки, созданной с пружинными загрузками Maven-плагиным
@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 │ ├───classes │ │ ├───com │ │ │ └───app │ │ │ └───starter │ │ │ └───Starter.class | | | │ │ └───config │ └───lib | ├───tool1.jar | | └───Foo.java | └───tool2.jar | └───Bar.java ├───META-INF │ └───maven │ └───com.app.starter │ └───starter └───org └───springframework └───boot └───loader ├───archive ├───data ├───jar └───util
В то время как это работает отлично от затмения, когда я пытаюсь запустить Starter.java, но при попытке построить проект с 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 ПОМ файла:
<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. Чтобы я мог начать любой проект, который я хочу, из основного класса стартера в соответствии с переданными параметрами. Возможно ли это с весенним сапогом? Я попытался вызвать основные методы в 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);
Может кто-нибудь предложить, какой способ достичь этого? Любые идеи действительно оценены.