使用Spring-Boot创建一个简单的JAR而非可执行的JAR

Joh*_*ing 6 java spring jar maven spring-boot

我对多模块Spring-Boot应用程序有疑问。

我有一个用于服务的模块,即核心 -Module。还有一个用于视图相关类的模块,即Web -Module。都在父模块 -Module中,我在其中添加了依赖性,例如“ spring-boot-starter”,并且两个模块都可以使用它们。

现在解决问题:

我想使用嵌入式Tomcat 运行web -Module,并将核心 -Module作为web -module中的依赖项。

在其他Spring项目中,我只包含maven-jar-plugin并创建一个核心 -Module 的jar 。

这个Spring-Boot项目中的问题是,已经在“ spring-boot-starter”中配置了maven-jar-plugin。它需要一个mainClass,只有web模块才有。

小节选自“ spring-boot-starter” -POM

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>${start-class}</mainClass>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以将核心 -Module 打包为JAR,而无需在该模块中使用“开始类”?

Tom*_*eba 6

似乎您可以通过配置来禁止fat-JAR替换原始JAR并将其安装到仓库中spring-boot-maven-plugin

取自http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/maven-plugin/examples/repackage-disable-attach.html

默认情况下,重新打包目标将用可执行文件替换原始工件。如果您只需要部署原始jar,但仍能够使用常规文件名运行您的应用,请按以下步骤配置插件:

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.1.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
            <configuration>
              <attach>false</attach>
            </configuration>
          </execution>
        </executions>
        ...
      </plugin>
      ...
    </plugins>
    ...
  </build>
  ...
</project>
Run Code Online (Sandbox Code Playgroud)

这种配置将生成两个工件:原始工件和由重新打包目标产生的可执行计数器部分。仅原始的将被安装/部署。


SeB*_*.Fr 5

您可以通过这种方式禁用spring-boot-maven插件。

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)


Jud*_*ing 0

如果您使用嵌入式 tomcat 来运行您的应用程序,您是否只需要为您的 Web 应用程序提供一个标准的 Spring Boot fat jar?如果是这样,只需在 pom 中将您的 Web 模块标记为依赖于您的核心模块,然后构建您的项目。

是否有不同的用例需要将罐子分开?

您是将模块构建为完全独立的模块还是将模块构建为单个多模块项目的一部分?不同之处在于后者,您将在根目录中有一个 pom 指定模块。我具体忘记了 Maven 语法,所以我的示例是 Gradle(多模块构建的 Maven 文档位于此处)。对于那个很抱歉。

baseProject
|----web-module
|----core-module
Run Code Online (Sandbox Code Playgroud)

baseProject的build.gradle:

project(':web-module') {
    dependencies {
        compile project(':core-module')
    }
    evaluationDependsOn(':core-module')

}
Run Code Online (Sandbox Code Playgroud)

Maven 也有类似的结构。您应该查看文档,但我相信您需要做的就是在父 pom 中正确指定模块顺序,如下所示,并将依赖项包含在您的 web 模块 pom 中。

父pom:

...
<modules>
    <module>core-module</module>
    <module>web-module</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

网络pom:

<project ...>

<parent>
    <groupId>com.example</groupId>
    <artifactId>simple-parent</artifactId>
    <version>1.0</version>
</parent>

<artifactId>web-module</artifactId>
<packaging>war</packaging>
<name>My web-module</name>
<dependencies>

...
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>core-module</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>
...
Run Code Online (Sandbox Code Playgroud)

core pom 应该只需要包含parent上面 web 模块中的部分,其他方面都是相同的。