解决 maven 打包后无本地jar

Maven使用本地jar包并打包进war包里面的方法

很显然,这种方法是很不可取的,因为Maven是用来团队合作,以及发布开源代码的。而使用本地jar包,则使得Maven丧失了这部分的优点。不过,我遇到的问题是,我想学习Maven,然后我以前的项目,公司的项目都不是用Maven的。然后我想引用其中的一些jar包,特别是某些项目build之后在dist文件夹下的包。所以,才想出了下面的法子。

我先在我的Maven项目下建立一个lib文件夹,把我要用到的jar包都放到里面去。然后在pom.xml里添加如下的内容:

<dependency> <groupId>com.weiresearch</groupId> <artifactId>webharvest</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/webharvest.jar</systemPath> </dependency>

这里的groupId,artifactId,version都可以随便写。然后scope要写成system,systemPath就写为要引用的jar包路径。这里不知道能否批量导入,没测试过,不过貌似不可以。

但是,还有个麻烦问题,我把我的项目打包成war包的时候,它居然只有我写的代码,而不包括引用的jar包。这就很麻烦了,打包的war包就不能直接使用了。找来好久,终于找到原因了。首先是其他正常使用maven的包,如下:

<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>

这里引用的是servlet包,最重要的是scope这个字段,provided的意思,就是说这个jar包,在这个项目可能的运行环境里,都会提供了的,所以就不用打包到war包里面了。因此,要使得war包里面包含servlet这个包,只要把scope这句给删除掉就可以了。

而上面利用system这个scope引入的webharvest包,同样也没有引入进去。看了下网上的评论,才说最好不要用system这个scope。大概是说这个system指的是JDK里面会包含这个jar包吧。这个解决方法就麻烦人了,最后是看到了这个问答才解决了的:Maven 2 assembly with dependencies: jar under scope “system” not included ,解决方法如下:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>${project.basedir}/lib</directory> <targetPath>WEB-INF/lib</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> </configuration> </plugin>

directory字段指向的是包含你所有要用jar包的目录

targetPath则是编译后要把这些jar包复制到的位置

下面的filtering就是只导入所有以jar为后缀的文件

通过上面的设置,就能把你要的jar包导入进去了

转载于:https://my.oschina.net/u/1157906/blog/182307

在使用 Maven 打包生成的本地 JAR 文件启动应用时,如果遇到 `NoClassDefFoundError` 错误,通常意味着运行时类路径中缺少某些必要的依赖类。该问题可能源于构建配置不完整或依赖管理不当。 ### 常见原因及解决方案 #### 1. 依赖未正确打包进最终 JAR 默认情况下,Maven 构建的 JAR 文件不会包含项目所依赖的第三方库(即依赖 JAR)。当这些依赖未被正确打包进最终可执行 JAR 中时,程序运行时将无法找到对应的类定义,从而抛出 `NoClassDefFoundError`。 **解决方案:使用 maven-assembly-plugin 打包所有依赖** 可在 `pom.xml` 的 `<build>` 部分添加以下插件配置,将所有依赖项合并到一个“fat jar”中: ```xml <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.mycm.demo.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> ``` 执行 `mvn package` 后,生成的带有 `-jar-with-dependencies.jar` 后缀的文件即为包含所有依赖的完整 JAR 包 [^3]。 #### 2. 类路径未正确指定 若未使用“fat jar”,而是希望手动管理类路径,则需要确保在运行命令中显式指定依赖路径。 **解决方案:使用 `-cp` 参数指定依赖路径** 例如: ```bash java -cp "your-app.jar:lib/*" com.mycm.demo.Main ``` 其中 `lib/` 目录应包含所有必需的依赖 JAR 文件。 #### 3. 依赖版本冲突或缺失 有时,`NoClassDefFoundError` 是由于依赖版本冲突、作用域设置错误(如 `test` 或 `provided`)或依赖未正确下载所致。 **解决方案:检查依赖树和作用域** 可通过以下命令查看完整的依赖树: ```bash mvn dependency:tree ``` 并确保所有关键依赖的作用域为 `compile`(默认),而非 `test` 或 `provided`。 #### 4. 使用 Spring 框架时特定类缺失 如引用中提到的问题所示,在使用较旧版本的 Spring(如 2.0.4)时,某些测试类(如 `org.springframework.mock.web.MockHttpServletRequest`)可能不存在于发布包中 [^2]。 **解决方案:升级 Spring 版本或添加 spring-test 模块** 建议升级至更高版本的 Spring 框架,或者单独引入 `spring-test` 模块以获取相关测试类支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值