当前位置: 首页 > 知识库问答 >
问题:

在使用spring-boot-maven-plugin创建的嵌套可执行jar中启动main类

曾承弼
2023-03-14

我有一个简单的Spring启动课是这样的:

@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);
        }
     }
}

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时,这在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作为父项目,它也将parent声明为spring-boot-starter。Foo、Bar和Starter项目都是父项目的子项目。

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个答案

端木野
2023-03-14

经过长时间的研究,在团队领导的帮助下,我终于找到了解决方案。这实际上是spring-boot-maven插件创建的可执行jar依赖项的问题。我的starter类无法在依赖项列表中找到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 jar成为一般的jar,并且所有的工作都按照预期进行。

希望这对使用spring-boot-maven插件的人有所帮助。

 类似资料:
  • 最近,我写了一个Spring-Boot项目,我希望Maven能够创建一个jar文件,我可以通过命令“java-jar”运行该文件。 这是我编写的pom.xml: 您能否考虑一种配置pom.xml文件的方法,使我能够使用“native”命令“mvn clean package”而不是繁琐的“mvn clean package spring-boot:repackage”获得jar文件? 谢谢

  • 我需要从我的应用程序中制作一个可执行的jar包。 这是我的pom.xml: 我用mvn clean package-DskipTests=true构建包,并通过java-jar运行它,我得到了以下结果: mvn--version Apache Maven 3.6.0(NON-CANONICAL_2018-11-06T03:14:22 01:00_root;2018-11-06T03:14:22 0

  • 问题内容: 我有一个Maven项目,我想从中创建两个可执行的jar文件。一个将与用户交互使用,第二个将作为计划作业运行,读取前者生成的日志文件。最后,除了MANIFEST.MF文件中的Main- Class属性外,我希望两个jar文件都相同。 我正在使用maven-antrun- plugin创建一个可执行jar,在我尝试通过引入Maven配置文件尝试创建第二个jar文件之前,这似乎工作得很好。我

  • 问题内容: 使用Maven 3.1 Eclipse Helios Aspekt: 尝试使用maven-jar / dependency-plugins创建可运行的jar文件。 问题: 创建jar文件和依赖项后,当我尝试使用命令启动jar文件时出现NoCLassDefFoundErrors 但是类/文件可以在./dependency-jars文件夹中找到???我还尝试了以下命令: 这也不起作用。 题

  • 是否可以在Spring Boot可执行jar中启动与声明的mainClass不同的Java类(使用main方法)? 特性:应该启动的类位于嵌入可执行jar(在lib文件夹中)的库中。 背景资料: 可执行jar包含一个库,其中包含一个类,我想调用该类以正常关闭应用程序。该库嵌入在可执行文件jars lib文件夹中,默认Java类路径参数无法访问该库。

  • 问题内容: 我想使用码头来启动我的应用程序,因此我添加了下面提到的依赖项。当我运行主要方法Jetty成功启动时(我正在一个struts2 + spring3 + hibernate maven项目中,我也可以将其部署在tomcat中) 现在,我想从war包装pom创建一个可执行jar。所以我在pom中添加了maven-assembly-plugin。(我尝试使用maven jar插件,但未添加依赖