在使用spring-boot-maven-plugin

时间:2016-10-06 08:27:08

标签: maven spring-boot spring-boot-maven-plugin

我有一个简单的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文件中的Main类文件,并且还使用@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时,这可以从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项目都是父项目的子项。

我想制作一个单独的胖jar,其中所有依赖项都嵌套在spring-boot-maven-plugin中。这样我就可以根据传递的参数从起始主类中启动我想要的任何项目。弹簧靴可以吗?我试图用类加载器调用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);

有人可以建议实现这个目标的方法吗?任何想法都非常感激。

1 个答案:

答案 0 :(得分: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 jars成为一般的,一切都按预期工作。

希望这有助于某人使用spring-boot-maven插件。