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 文件中的 Main 类文件,并且还使用 @SpringBootApplication 进行了注释。jar 文件结构如下图所示。

├───BOOT-INF
│ ├───类
│ │ ├───com
│ │ │ └───app
│ │ │ └───启动器
│ │ │ └───Starter.class
| | |
│ │ └───配置
│ └───lib
| ├───tool1.jar
| | └────Foo.java
| └────tool2.jar
| └───Bar.java
├────META-INF
│ └───maven
│ └───com.app.starter
│ └───启动器
└────组织
    └────springframework
        └────开机
            └────装载机
                ├────存档
                ├────数据
                ├────罐子
                └───实用程序

虽然当我尝试启动 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 jars 成为通用的,并且一切都按预期工作。

希望这可以帮助某人使用 spring-boot-maven 插件。

于 2016-10-06T11:38:32.610 回答