我有一个简单的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中 . 这样我就可以根据传递的参数从起始主类中启动我想要的任何项目 . spring 靴可以吗?我试图用类加载器调用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 回答
经过长时间的研究并在我的团队领导的帮助下,我能够找到解决方案 . 它实际上是spring-boot-maven插件创建的可执行jar依赖项的问题 . 我的入门类无法在依赖项列表中找到Foo.java或Bar.java,因为这些jar也是可执行的jar . 最后,我在我的foo-project和bar-project POM文件中添加了这些行:
这使得foo-project和bar-project jars成为一般的,一切都按预期工作 .
希望这有助于某人使用spring-boot-maven插件 .