无法在多模块项目中正确打包Spring Boot应用程序

时间:2017-06-14 07:02:19

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

基本上,我有一个多模块项目如下:

parent-project
├── core-app
└── web-app

core-appweb-app都是Spring Boot项目,其父级是parent-project而不是spring-boot-starter-parent。因此,他们都有:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <type>pom</type>
                <version>${spring.boot.version}</version>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

在他们的pom.xml中,以及:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>${spring.boot.version}</version>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

这个设置完全在IntelliJ中运行,但是,如果我package应用程序,我会得到一个非常小的.jar,基本上如果我尝试运行它可执行文件,我会得到几个command not found错误。

如果我使用java -cp my.jar com.Main运行它,我会SpringApplication not found。因此,据我所知,core-appweb-app并没有jar中的所有依赖项。

如果我将其构建为独立的.jar,并将spring-boot-starter-parent作为其父级;它有效。

我做错了什么?感谢。

更新

现在这就是我mvn package时发生的事情。但是,当我实际执行mvn spring-boot:repackage时,我得到了:

Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Source must refer to an existing file

正如这里所建议的this似乎解决了这个问题,但我怀疑它可能不是标准方式。例如:

mvn clean package spring-boot:repackage可以解决问题,但我不能mvn clean && mvn package && mvn spring-boot:repackage。我很感激对此的解释。谢谢!

1 个答案:

答案 0 :(得分:1)

Maven项目只能有一个父母和你的&#34;模块&#34;除非parent-project是父母,否则不能成为模块。理论上你可以使project-parent扩展Boot父级,但这可能会很复杂。

相反,只需继续选择性地使用Boot依赖项和包含。使用dependencyManagement中的parent-project和BOM导入,仅提取每个模块实际需要的依赖项(可能包括胖jar的spring-boot-starter-web),并添加Maven插件 for仅限独立的远程jar模块

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后,您将获得标准尺寸(通常为几K)的依赖性罐子以及特定需要的整个处理。