想要从其他模块中使用 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文件不太了解,我曾经误以为它可以从其他模块中使用而不需考虑其他事情。总算还是能够稍微理解,令人庆幸。

广告
将在 10 秒后关闭
bannerAds