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

时间:2016-07-11 17:05:34

标签: java spring maven jar spring-boot

我遇到多模块Spring-Boot应用程序的问题。

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

现在问题:

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

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

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

摘自“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>

有没有办法将 core -Module打包为JAR,而不需要在该模块中使用“start-class”?

7 个答案:

答案 0 :(得分:5)

您似乎可以通过配置spring-boot-maven-plugin来禁用fat-JAR替换原始文件并将其安装到repo中。

取自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>
  

此配置将生成两个工件:原始工件和重新打包目标生成的可执行计数器部件。只安装/部署原始版本。

答案 1 :(得分: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>

答案 2 :(得分:0)

If you're using the embedded tomcat to run your app, don't you just want a standard Spring Boot fat jar for your web app? If so, just mark your web module as dependent on your core module in the pom, and build your project.

It's there a different use case that you need the jars separated?

Are you building your modules as completely separate modules or as modules as part of a single multi-module project? The difference is in the latter, you will have a pom at the root specifying the modules. I forget the Maven syntax specifically, so my example is Gradle (Maven docs for multi-module builds are here). Sorry about that.

baseProject
|----web-module
|----core-module

baseProject's build.gradle:

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

}

Maven has a similar structure. You should review the docs, but I believe all you need to do is specify the module order correctly in your parent pom as below and include the dependency in your web-module pom.

Parent pom:

...
<modules>
    <module>core-module</module>
    <module>web-module</module>
</modules>

web-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>
...

core pom should only need to include the parent section as in the web-module above, and otherwise be the same.

答案 3 :(得分:0)

我找到了答案。 我配置我的应用程序就像@judgingnotjudging解释的那样。不同之处在于我把它放在了 -POM:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

它阻止了子模块中JAR的默认创建。我可以通过在 web -Module中包含 only 来解决此问题。

这样Spring-Boot就可以从 web -Module构建一个fat-JAR,从 core -Module构建一个简单的JAR。

答案 4 :(得分:0)

您只需更改

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>

答案 5 :(得分:0)

创建简单的jar更新

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>

收件人

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <classifier>exec</classifier>
        </configuration>
    </plugin>

有关更多详细信息,请访问下面的Spring URL:- https://docs.spring.io/spring-boot/docs/1.1.2.RELEASE/reference/html/howto-build.html

答案 6 :(得分:0)

我不知道它是否仍然有用,但是,需要为spring-boot-maven-plugin配置一个简单的分类器-

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

这将生成两个jar,一个是普通的jar,可以包含为依赖项,另一个是exe jar,后缀“ exec”字词作为后缀-如test-0.0.1-SNAPSHOT-exec.jar和test-0.0.1-SNAPSHOT.jar