拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 spring-boot:repackage和Maven:package之间的区别

spring-boot:repackage和Maven:package之间的区别

白鹭 - 2021-11-24 1001 0 0

1.概述

Apache Maven是一种广泛使用的项目依赖项管理工具和项目构建工具。

在过去的几年中,Spring Boot已经成为构建应用程序的非常流行的框架。还有一个Spring Boot Maven插件在Apache Maven中提供Spring Boot支持。

我们知道,当我们想使用Maven将应用程序打包在JAR或WAR工件中时,可以使用mvn package 。但是,Spring Boot Maven插件附带了一个repackage目标,它也在mvn命令中被调用。

有时,这两个mvn命令令人困惑。在本教程中,我们将讨论mvn packagespring-boot:repackage的区别。

2. Spring Boot应用示例

首先,我们将创建一个简单的Spring Boot应用程序作为示例:

@SpringBootApplication

 public class DemoApplication {

 public static void main(String[] args) {

 SpringApplication.run(DemoApplication.class, args);

 }

 }

为了验证我们的应用程序是否已启动并正在运行,让我们创建一个简单的REST端点:

@RestController

 public class DemoRestController {

 @GetMapping(value = "/welcome")

 public ResponseEntity welcomeEndpoint() {

 return ResponseEntity.ok("Welcome to Baeldung Spring Boot Demo!");

 }

 }

3. Maven的package目标

我们只需要spring-boot-starter-web依赖关系来构建我们的Spring Boot应用程序:

<artifactId>spring-boot-artifacts-2</artifactId>

 <packaging>jar</packaging>

 ...

 <dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-web</artifactId>

 </dependency>

 ...

Maven的package目标将采用编译后的代码并将其打包为可分发格式,在这种情况下为JAR格式:

$ mvn package

 [INFO] Scanning for projects...

 [INFO] ------< com.baeldung.spring-boot-modules:spring-boot-artifacts-2 >------

 [INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT

 [INFO] --------------------------------[ jar ]---------------------------------

 ...

 [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ spring-boot-artifacts-2 ---

 [INFO] Building jar: /home/kent ... /target/spring-boot-artifacts-2.jar

 [INFO] ------------------------------------------------------------------------

 [INFO] BUILD SUCCESS

 [INFO] ------------------------------------------------------------------------

 ...

执行mvn package命令后,我们可以在target目录下找到已构建的JAR文件spring-boot-artifacts-2.jar 。让我们检查创建的JAR文件的内容:

$ jar tf target/spring-boot-artifacts-2.jar

 META-INF/

 META-INF/MANIFEST.MF

 com/

 com/baeldung/

 com/baeldung/demo/

 application.yml

 com/baeldung/demo/DemoApplication.class

 com/baeldung/demo/DemoRestController.class

 META-INF/maven/...

从上面的输出中可以看到, mvn package命令创建的JAR文件仅包含来自项目源的资源和已编译的Java类

我们可以将此JAR文件用作另一个项目中的依赖项。但是,即使它是Spring Boot应用程序,我们也不能使用java -jar JAR_FILE执行JAR文件。这是因为没有捆绑运行时依赖项。例如,我们没有Servlet容器来启动Web上下文。

要使用简单的java -jar命令启动我们的Spring Boot应用程序,我们需要构建一个胖的JAR。 Spring Boot Maven插件可以帮助我们。

4. Spring Boot Maven插件的repackage目标

现在,让我们弄清楚spring-boot:repackage作用。

4.1。添加Spring Boot Maven插件

要执行repackage目标,我们需要在pom.xml添加Spring Boot Maven插件:

<build>

 <finalName>${project.artifactId}</finalName>

 <plugins>

 <plugin>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-maven-plugin</artifactId>

 </plugin>

 </plugins>

 </build>

4.2。执行spring-boot:repackage目标

现在,让我们清理先前构建的JAR文件,并尝试使用spring-boot:repackage

$ mvn clean spring-boot:repackage

 ...

 [INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli) @ spring-boot-artifacts-2 ---

 [INFO] ------------------------------------------------------------------------

 [INFO] BUILD FAILURE

 [INFO] ------------------------------------------------------------------------

 ...

 [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli)

 on project spring-boot-artifacts-2: Execution default-cli of goal

 org.springframework.boot:spring-boot-maven-plugin:2.3.3.RELEASE:repackage failed: Source file must not be null -> [Help 1]

 ...

糟糕,这行不通。这是因为**spring-boot:repackage目标将现有的JAR或WAR归档文件作为源,并将最终项目中的所有项目运行时依赖项与项目类一起重新打包。这样,可以使用命令行java -jar JAR_FILE.jar来执行重新打包的工件。**

因此,我们需要在执行spring-boot:repackage目标之前先构建JAR文件:

$ mvn clean package spring-boot:repackage

 ...

 [INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT

 [INFO] --------------------------------[ jar ]---------------------------------

 ...

 [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ spring-boot-artifacts-2 ---

 [INFO] Building jar: /home/kent/.../target/spring-boot-artifacts-2.jar

 [INFO]

 [INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default-cli) @ spring-boot-artifacts-2 ---

 [INFO] Replacing main artifact with repackaged archive

 [INFO] ------------------------------------------------------------------------

 [INFO] BUILD SUCCESS

 ...

4.3。重新打包的JAR文件的内容

现在,如果我们检查target目录,我们将看到重新打包的JAR文件和原始JAR文件:

$ ls -1 target/*jar*

 target/spring-boot-artifacts-2.jar

 target/spring-boot-artifacts-2.jar.original

让我们检查重新打包的JAR文件的内容:

$ jar tf target/spring-boot-artifacts-2.jar

 META-INF/

 META-INF/MANIFEST.MF

 ...

 org/springframework/boot/loader/JarLauncher.class

 ...

 BOOT-INF/classes/com/baeldung/demo/

 BOOT-INF/classes/application.yml

 BOOT-INF/classes/com/baeldung/demo/DemoApplication.class

 BOOT-INF/classes/com/baeldung/demo/DemoRestController.class

 META-INF/maven/com.baeldung.spring-boot-modules/spring-boot-artifacts-2/pom.xml

 META-INF/maven/com.baeldung.spring-boot-modules/spring-boot-artifacts-2/pom.properties

 BOOT-INF/lib/

 BOOT-INF/lib/spring-boot-starter-web-2.3.3.RELEASE.jar

 ...

 BOOT-INF/lib/spring-boot-starter-tomcat-2.3.3.RELEASE.jar

 BOOT-INF/lib/tomcat-embed-core-9.0.37.jar

 BOOT-INF/lib/jakarta.el-3.0.3.jar

 BOOT-INF/lib/tomcat-embed-websocket-9.0.37.jar

 BOOT-INF/lib/spring-web-5.2.8.RELEASE.jar

 ...

 BOOT-INF/lib/httpclient-4.5.12.jar

 ...

如果我们检查上面的输出,则它比mvn package命令构建的JAR文件长得多。

在这里,在重新打包的JAR文件中,我们不仅具有来自项目的已编译Java类,而且还具有启动Spring Boot应用程序所需的所有运行时库。例如,嵌入式tomcat库被打包到BOOT-INF/lib目录中。

接下来,让我们启动我们的应用程序并检查它是否有效:

$ java -jar target/spring-boot-artifacts-2.jar

 . ____ _ __ _ _

 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \

 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/ ___)| |_)| | | | | || (_| | ) ) ) )

 ' |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/



 2020-12-22 23:36:32.704 INFO 115154 [main] com.baeldung.demo.DemoApplication : Starting DemoApplication on YK-Arch with PID 11515...

 ...

 2020-12-22 23:36:34.070 INFO 115154 [main] osbwembedded.tomcat.TomcatWebServer: Tomcat started on port(s): 8080 (http) ...

 2020-12-22 23:36:34.078 INFO 115154 [main] com.baeldung.demo.DemoApplication : Started DemoApplication in 1.766 seconds ...

我们的Spring Boot应用程序已启动并正在运行。现在,让我们通过调用/welcome端点来验证它:

$ curl http://localhost:8080/welcome

 Welcome to Baeldung Spring Boot Demo!

大!我们得到了预期的答复。我们的应用程序正常运行。

4.4。在Maven的软件包生命周期中执行spring-boot:repackage目标

我们可以在pom.xml配置Spring Boot Maven插件,以在Maven生命周期的package阶段重新打包工件。换句话说,当我们执行mvn package, spring-boot:repackage将被自动执行。

配置非常简单。我们只是将repackage目标添加到execution元素中:

<build>

 <finalName>${project.artifactId}</finalName>

 <plugins>

 <plugin>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-maven-plugin</artifactId>

 <executions>

 <execution>

 <goals>

 <goal>repackage</goal>

 </goals>

 </execution>

 </executions>

 </plugin>

 </plugins>

 </build>

现在,让我们再次运行mvn clean package

$ mvn clean package

 ...

 [INFO] Building spring-boot-artifacts-2 1.0.0-SNAPSHOT

 [INFO] --------------------------------[ jar ]---------------------------------

 ...

 [INFO] --- spring-boot-maven-plugin:2.3.3.RELEASE:repackage (default) @ spring-boot-artifacts-2 ---

 [INFO] Replacing main artifact with repackaged archive

 [INFO] ------------------------------------------------------------------------

 [INFO] BUILD SUCCESS

 ...

输出显示重新打包目标已执行。如果检查文件系统,我们会发现重新打包的JAR文件已创建:

$ ls -lh target/*jar*

 -rw-r--r-- 1 kent kent 29M Dec 22 23:56 target/spring-boot-artifacts-2.jar

 -rw-r--r-- 1 kent kent 3.6K Dec 22 23:56 target/spring-boot-artifacts-2.jar.original

5.结论

在本文中,我们讨论了mvn packagespring-boot:repackage之间的区别。

另外,我们还学习了如何在Maven生命周期的package阶段执行spring-boot:repackage

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *