首页 文章

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

提问于
浏览
2

我有一个多模块Spring-Boot应用程序的问题 .

我有一个模块,我用于服务,核心模块 . 一个用于视图相关类的模块,即web模块 . 它们都在父模块中,我在其中添加依赖项,如"spring-boot-starter",并且可以由两个模块使用 .

现在来问题:

我想运行带有嵌入式Tomcat的web模块,并将core-Module作为Web模块中的依赖项 .

在其他Spring项目中,我只需要包含maven-jar-plugin并创建一个core-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>

有没有办法将核心模块打包为JAR,而不需要在该模块中使用"start-class"?

4 回答

  • 3

    您可以通过这种方式禁用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>
    
  • 0

    看起来你可以通过配置 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>
    

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

  • 0

    如果您使用嵌入式tomcat来运行您的应用程序,那么您是否只想为您的Web应用程序使用标准的Spring Boot胖 jar ?如果是这样,只需将您的Web模块标记为依赖于pom中的核心模块,然后构建项目 .

    这是一个不同的用例,您需要将 jar 分开吗?

    您是将模块构建为完全独立的模块,还是将模块构建为单个多模块项目的一部分?区别在于后者,您将在根目录中指定模块 . 我特别忘记了Maven语法,所以我的例子是Gradle(多模块构建的Maven文档是here) . 对于那个很抱歉 .

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

    baseProject的build.gradle:

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

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

    父母pom:

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

    网络-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>
    ...
    

    核心pom应该只需要包含 parent 部分,如上面的web模块,否则是相同的 .

  • 4

    我找到了答案 . 我配置我的应用程序就像@judgingnotjudging解释的那样 . 区别在于我把它放在了父母POM中:

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

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

    这样Spring-Boot就可以从web-Module和一个来自core-Module的简单JAR构建一个fat-JAR .

相关问题