Eclipse中Maven构建可执行Jar时本地Jar未打包的问题求助
解决Maven打包时System Scope依赖未纳入可执行Jar的问题
你遇到的核心问题是system scope的依赖默认不会被Maven打包插件包含——这个scope的设计初衷是标记「由运行环境提供的系统级依赖」,所以Maven会默认跳过将它打包进最终的可执行Jar,这就导致运行时找不到com.sample.commons.*下的类。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:将本地Jar安装到本地Maven仓库(最规范)
这是最符合Maven依赖管理理念的做法,能彻底避免system scope带来的各种路径和依赖管理问题:
- 打开终端,执行以下命令(替换
path/to/scp-commons.jar为你的Jar实际本地路径):mvn install:install-file -Dfile=path/to/scp-commons.jar -DgroupId=_GroupID1_ -DartifactId=scp-commons -Dversion=1 -Dpackaging=jar - 修改pom.xml里的scp-commons依赖,删除
<scope>system</scope>和<systemPath>这两行,只保留核心依赖配置:<dependency> <groupId>_GroupID1_</groupId> <artifactId>scp-commons</artifactId> <version>1</version> </dependency> - 重新执行
mvn package,此时Maven会自动从本地仓库拉取依赖,打包时也会正常把scp-commons的类合并进main.jar。
方案2:修改Assembly插件的Descriptor,强制包含System依赖
如果不想把Jar安装到本地仓库,可以在你的assemblytoola.xml里添加配置,让assembly插件强制包含system scope的依赖:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd"> <id>jar-with-dependencies</id> <formats> <format>jar</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <dependencySets> <dependencySet> <outputDirectory>/</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <!-- 开启对system scope依赖的包含 --> <includeScope>system</includeScope> <!-- 把依赖解压后合并到最终Jar里 --> <unpack>true</unpack> </dependencySet> </dependencySets> </assembly>
保存后重新执行mvn package,assembly插件就会把scp-commons的类打包进最终的可执行Jar了。
方案3:改用Maven Shade插件(更省心的打包方式)
Maven Shade插件是专门用来构建包含所有依赖的可执行Jar的工具,默认支持处理system scope的依赖,替换你pom.xml里的assembly插件为以下配置即可:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <!-- 可替换为最新稳定版 --> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定主类,生成可执行Jar的Manifest --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.sample.client.pat.toola.CpatToolA</mainClass> </transformer> </transformers> <!-- 明确包含你的scp-commons依赖 --> <artifactSet> <includes> <include>_GroupID1_:scp-commons</include> </includes> </artifactSet> </configuration> </execution> </executions> </plugin>
执行mvn package后,Shade插件会自动把所有依赖(包括system scope的scp-commons)合并到最终的Jar中,同时生成正确的可执行Manifest。
内容的提问来源于stack exchange,提问作者Jason Xavier
相关产品推荐
相关产品推荐

