想要从其他模块中使用 SpringBoot 的 Jar
解释
当需要在其他模块中使用SpringBoot的Jar时,我将所调查的内容整理在下面。
我只想简单地调用Spring Boot的jar包。
使用样本的方法,可以直接使用spring-boot-maven-plugin创建可执行的jar文件。
详细信息可以在这里找到。
在生成的jar文件中,包含了所依赖的jar文件,被称为Uber jar(Fat jar)。
文件大小当然很大。
由于它是适用于Spring Boot的可执行文件格式,因此无法用作库的调用。
此时的pom.xml如下所示。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
那么,要实现调用的话该怎么做呢?我们可以去查看一下Spring Boot Maven插件的文档。
- これまたサンプルそのままだと、spring-boot-starter-parent プロジェクトから継承しているので、repackageゴールを自分でpomに書かなくてもよいみたい。実際にSTSとかで「実効POM」でみるとすでに書かれているようだ。
找到引起问题的描述并封装可执行存档的过程中。
原本(不可执行的)工件默认情况下会被重命名为 .original,但也可以使用自定义标识符来保留原始工件。
原始的JAR被重命名为.original,另外似乎还可以创建一个可以执行的JAR文件。
如果使用jar xvf命令来展开.original文件,其内容与可执行的JAR文件的结构相差很大。
│ application.properties
│
├─com
│ └─example
│ └─demo
│ DemoApplication.class
│ HelloController.class
│
├─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.example
│ └─demo
│ pom.properties
│ pom.xml
│
└─static
index.html
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ demo ---
[INFO] Building jar: C:\workspace\demo\target\demo-0.0.1-SNAPSHOT.jar
↑これがoriginalとみた
↓でゴニョゴニョやって実行可能にしてくれると想像
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.5:repackage (repackage) @ demo ---
[INFO] Replacing main artifact with repackaged archive
最后,所有的东西都写在这里:https://spring.pleiades.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#packaging.examples.custom-classifier
默认情况下,重新打包目标会将原始构件替换为重新打包的构件。这是表示应用程序的模块正常工作的方式,但如果模块作为另一个模块的依赖关系使用,则需要提供重新打包模块的分类器。原因是依赖的类无法加载重新打包的jar文件的类,因为应用程序类被打包到BOOT-INF/classes中。
在这种情况下,或者保持原始构件并使用不同的分类器附加重新打包的构件,您可以像下面的示例一样配置插件。
根据网上的说法,由于无法将可执行的jar作为其他模块的依赖关系使用,所以在这种情况下需要使用原始的(.original)文件。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>repackage</id>
+ <configuration>
+ <classifier>exec</classifier>
+ </configuration>
+ </execution>
+ </executions>
</plugin>
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ demo ---
[INFO] Building jar: C:\workspace\demo\target\demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.4.5:repackage (repackage) @ demo ---
[INFO] Attaching repackaged archive C:\\workspace\demo\target\demo-0.0.1-SNAPSHOT-exec.jar with classifier exec
-
- demo-0.0.1-SNAPSHOT.jar(呼び出す用。実行可能ではないjar)
- demo-0.0.1-SNAPSHOT-exec.jar(実行可能jar)
通过将attach选项设置为false,现在只安装了原始文件(非可执行的jar文件)。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
结束
由于对SpringBoot可执行的jar文件不太了解,我曾经误以为它可以从其他模块中使用而不需考虑其他事情。总算还是能够稍微理解,令人庆幸。