2016-10-06 2 views
3

У меня есть простой класс 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); 

Может кто-нибудь предложить, какой способ достичь этого? Любые идеи действительно оценены.

ответ

2

Наконец, после долгого исследования и с помощью моей команды, я могу найти решение. На самом деле это проблема исполняемой jar-зависимости, созданной плагином spring-boot-maven. Мой стартовый класс не смог найти список Foo.java или Bar.java в списке зависимостей, потому что эти банки также являются исполняемыми банками. Наконец, я добавил эти строки в моем Foo-проект и бар-проект П файл:

<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-проект и бар-проект баночку общего характер, и все работает, как ожидалось.

Надеюсь, это поможет кому-то работать с плагином spring-boot-maven.