You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Spring Maven插件,兼顾可执行JAR与依赖引用需求

解决方法

核心思路

Spring Boot的repackage默认会把类塞进BOOT-INF/classes做成可执行JAR,但这种结构没法被其他模块当依赖用。最靠谱的方式是生成两个JAR:一个是供其他模块依赖的标准JAR(类在根目录),另一个是能直接java -jar运行的可执行JAR。

修改后的pom.xml配置

<build>
    <finalName>aWattar</finalName>
    
    <plugins>
        <!-- 1. 生成标准JAR:类在根目录,供其他模块依赖,同时在MANIFEST中指定main类 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <!-- 指定目标main类 -->
                        <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass>
                        <!-- 配置类路径,若直接运行该JAR需将依赖放在同目录的lib文件夹 -->
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        
        <!-- 2. 生成可执行JAR:带Spring Boot标准结构,直接运行无需额外处理依赖 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass>
                <!-- 给可执行JAR加后缀区分,生成文件名如aWattar-exec.jar -->
                <classifier>exec</classifier>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

实际效果

执行mvn package后会得到两个JAR:

  • aWattar.jar:标准结构,类位于JAR根目录,MANIFEST已指定main类,其他模块可直接引用作为依赖。若要直接运行,需将所有依赖放在与JAR同目录的lib文件夹,再执行java -jar aWattar.jar。
  • aWattar-exec.jar:Spring Boot可执行JAR,自带所有依赖,直接执行java -jar aWattar-exec.jar即可启动程序。

单JAR方案(不推荐)

如果硬要一个JAR同时满足依赖和运行需求,需关闭Spring Boot的repackage,手动打包依赖并配置MANIFEST,但这种方式易引发依赖冲突,且Spring Boot自动配置可能受影响:

<properties>
    <spring-boot.repackage.skip>true</spring-boot.repackage.skip>
</properties>

<build>
    <finalName>aWattar</finalName>
    
    <plugins>
        <!-- 配置MANIFEST指定main类和类路径 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        
        <!-- 将依赖复制到项目构建目录的lib文件夹 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.6.0</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        
        <!-- 将类和lib目录打包成包含所有依赖的单JAR -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>de.gombers.electricity.awattar.MainDataGatherer</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

该方案生成的JAR体积较大,后续维护成本高,仅在特殊场景下考虑使用。


内容的提问来源于stack exchange,提问作者Ulrich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:14:57