在Maven1中,需要把依赖所需要的包每个列出。这对于使用类似如Hibernate的用户来说所操的心太多了,而且也不方便。在Maven2中实现了传递依赖,如此对于Hibernate所依赖的包,Maven2会自动下载,开发人员只需关心Hibernate即可。所以可以看出列出所需要的每个jar是在maven1中的功能,Maven2认为自动下载是一种改进。
这样就产生了一个问题:Maven2虽然把编译时需要的jar都下载了,但并不是所有编译需要的jar在打成war包后运行时也需要。所以也就发现有许多的jar是不需要的,以至war包比较大。我们可以通过以下方式改善:
策略一:
对于容器提供的(如:servlet-api-2.3等)和测试需要时的(如:junit-3.81等),可以直接在pom.xml中去掉。
maven的dependency中有一个tag是<scope>option</scope>,其option有以下几个值:
compile, 缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet-api-2.3.jar。
runtime, 在运行时使用,如JDBC驱动,适用运行和测试阶段。 如plexus-utils-1.1.jar
test 只在测试时使用,用于编译和运行测试代码。不会随项目发布。如Junit-3.8.1.jar
system, 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
如:
<dependency>
<groupId>servletapi</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
策略二:
对于第三方jar包,传递依赖到war包的,但发布时并不需要的。
如:我们项目中使用了webwork-2.2.3.jar。可以我们在打包后发现在war下的lib中多了spring-web-1.2.jar,可是我们项目并不需要这个jar啊。
第一种办法:借用<scope>provided</scope>
虽然provided的本意是指jdk或者容器提供的,只是编译中使用,但不会打到war中,但我们也可借用。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
第二种办法: 使用exclusions; (效果与第一种相同)
<dependency>
<groupId>opensymphony</groupId>
<artifactId>webwork</artifactId>
<version>2.2.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
策略三:
对于我们公司内部开发的jar包,我们都加上<optional>true</optional>,这样可以使引用这些jar的项目不会产生传递依赖。
如:项目mycom-csa中使用了mycom-cas-client-1.0.3.jar,然而mycom-cas-client-1.0.3.jar 又使用了mycom-common-security-1.0.3.jar。所以我们在对mycom-csa打包时会把mycom-common-security-1.0.3.jar打进package中。我们当然可以参考“策略二”,但最好的方法是:可以通知开发mycom-cas-client-1.0.3.jar的同事在mycom-cas-client-1.0.3.jar的pom.xml中对dependency修改为:
<dependency>
<groupId>com.mycom</groupId>
<artifactId>mycom-common-security</artifactId>
<version>1.0.3-SNAPSHOT</version>
<optional>true</optional>
</dependency>
添加<optional>true</optional> ,这样我们再打包时mycom-csa中就不会出现mycom-common-security-1.0.3.jar了。
相关推荐
sprintboot maven 打包分离lib jar 资源文件 properties xml yml 详细信息查看我的博客 https://mp.csdn.net/postedit/80274087 java -jar -cp 启动
6. 去掉JAR包中不需要的目录和文件。 开发环境是IntelliJ IDEA 2016版,Maven版本为3.3.9,项目目录结构遵循标准Maven项目结构。 Maven提供了多种打包插件,如maven-jar-plugin(默认的JAR打包插件)、maven-shade...
org.apache.maven.plugins maven-jar-plugin true lib/ xx.xx.xx.xx <!-- 分离配置文件 *.** */*.xml
新项目建立时,引用jar包时要慎重,不要一股脑儿直接拷贝老项目的依赖,避免后期又花时间来剔除。在功能代码重构时,也可以适当做一次剔除,因为后面还有自测,提交测试环节,如果有误删,测试的时间将会增加。 ...
- **Maven**:Apache Maven是一个项目管理和综合工具,通过pom.xml文件配置,可以轻松打包Java项目为jar,同时支持插件如`maven-jar-plugin`来定制打包过程,甚至通过`maven-shade-plugin`生成包含所有依赖的fat ...
在Java开发过程中,库文件,特别是jar包,是不可或缺的一部分。它们包含了各种预编译的类和资源,供开发者在项目中引用以实现特定功能。然而,随着时间的推移,项目可能会积累大量的jar包,其中可能包含许多未被使用...
在软件开发过程中,经常需要将多个JAR包合并成一个JAR包,以方便管理和部署。本文将详细介绍如何实现这一过程,并提供具体的操作步骤和技术细节。 ### 一、概述 在Java开发中,项目通常会依赖多个外部库或模块,...
主类是指运行`jar`包时执行的入口点,通常在`MANIFEST.MF`的`Main-Class`属性中指定。 3. **依赖管理**:`jar`包可以包含其他`jar`包作为依赖。在大型项目中,依赖管理工具如Maven或Gradle能自动处理这些依赖,确保...
基本的`jar`命令格式为`jar cvf jar_file_name.jar file_list`,其中`c`表示创建,`v`表示详细模式,`f`指定jar文件名,`file_list`是需要打包的文件列表。 2. **MANIFEST.MF文件**: 每个jar包都包含一个名为`...
标题中的"Idea打包springboot项目没有.original文件解决方案"是指在使用IntelliJ IDEA(Idea)工具打包Spring Boot应用时,出现缺少`.original`后缀的JAR文件的问题。这通常意味着打包过程中出现了异常,导致生成的...
- 如果项目有多个模块,可能需要考虑使用Maven或Gradle等构建工具来更高效地管理依赖和打包。 了解以上步骤和注意事项,你就能熟练地使用MyEclipse将Java程序打成jar包了。在实际工作中,这是一项基础但至关重要的...
Maven install 报错"程序包不存在"问题的解决方法需要我们详细地分析依赖关系,查找无效的 POM 文件,解决 B 模块的引用问题,并将 C 层引用到的 jar 包传到私服上面。同时,我们也可以尝试使用其他解决方法来解决...
- 当多个库有相同的依赖时,为了避免冲突,有时会将所有依赖都打包进一个大的JAR中,这就是Fat JAR。 - 工具如Shadow, One-JAR, and Maven Assembly Plugin可以帮助创建Fat JAR。 7. **JAR的优化**: - 使用...
Maven和Gradle这样的构建工具可以帮助管理这些依赖,自动下载并将它们打包到最终的JAR或WAR文件中。 6. **混淆和优化JAR** 为了保护代码安全和减小文件大小,开发者会使用ProGuard这样的工具对JAR进行混淆和优化,...
它通过去除人耳不易察觉的频带信息来实现高效的压缩,从而减少文件大小而不显著降低音质。MP3 Jar包的核心功能就是解析这种压缩格式,提供API供Java程序访问MP3文件的内容。 使用MP3 Jar包,开发者可以实现以下功能...
增加了servlet-api的jar包,工程去掉了对本地tomcat的jar包的依赖 打包的时候,运行clean package 即可。 可以将target中的war包拷入tomcat的webapps文件夹下,启动tomcat,但这种方法无法运行断点调试,只能看日志...
在使用非Maven版本JPress时,开发者需要确保所有依赖项已正确安装并配置,包括Java开发环境(JDK)、Servlet容器以及任何第三方库。他们还需要手动更新依赖,以获取最新的安全补丁和功能增强。 总结起来,非Maven...
这个仓库扮演着缓存的角色,当Maven构建项目时,首先会检查本地仓库中是否已经存在所需的依赖,如果存在则直接使用,若不存在,则从远程仓库下载并存入本地仓库。 **Maven仓库层级结构:** Maven仓库中的文件结构...
开发者可以通过`jar`命令行工具创建自定义的`jar`包,或者使用现代构建工具如`Maven`或`Gradle`的打包插件。在部署Java Web应用时,Web容器会解析`WAR`(Web ARchive)文件,其中包含`WEB-INF/lib`下的所有`jar`包...
修改仓库地址,仓库用于存放我们项目中使用到的jar包。在修改之前需要创建一个目录表示仓库,这里就在Maven下面创建的名为repo目录,这个目录地址可以任意地方,创建到Maven下是为了方便管理 D:\maven\repo。接下来...