maven打包时去除不需要的jar包策略

本文介绍Maven2中依赖管理的三种策略,包括如何利用scope、exclusions和optional属性来优化项目依赖,减少不必要的jar包,从而减小最终war包大小。

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了。

 

<think>好的,我现在需要解决用户的问题,即在使用Maven打包去掉生成文件中的版本号,通过配置finalName来实现。根据用户提供的引用内容,我需要先理解这些引用中的信息,然后整理出正确的步骤。 首先,用户提到了引用[2]、[3]、[4]中都提到了在pom.xml的<build>标签内添加finalName配置。特别是引用[4]给出了具体的配置示例,使用${project.artifactId}来替代默认的artifactId加版本号。因此,正确的做法应该是在pom.xml的<build>部分设置finalName为项目的artifactId,这样打包后的文件名就含版本号了。 接下来,我需要确认配置的位置和语法是否正确。根据Maven的官方文档,finalName确实是在<build>标签下配置的,默认值为${artifactId}-${version},所以去掉版本号只需要将finalName设置为${project.artifactId}即可。同,用户提供的引用中的示例都使用了这样的结构,说明这是一个通用的解决方案。 然后,我需要考虑可能的其他情况,比如是否会有其他插件影响打包结果。过根据引用内容,直接配置finalName已经足够,需要额外插件。另外,用户可能遇到的问题比如配置位置错误或者变量拼写错误,需要在回答中提醒用户注意检查这些点。 最后,整理步骤:找到pom.xml文件,在<build>标签内添加<finalName>${project.artifactId}</finalName>,保存后重新打包。这样生成的文件名就会只有artifactId,没有版本号了。同,可以建议用户验证打包后的文件名是否符合预期,以确保配置生效。</think>### 分步解答 要在Maven打包移除版本号,需通过`pom.xml`的`finalName`配置覆盖默认命名规则。具体步骤如下: 1. **打开项目根目录下的`pom.xml`文件** 找到`<build>`标签(若存在可手动添加)。 2. **在`<build>`标签内添加`finalName`配置** 使用表达式`${project.artifactId}`直接引用项目ID作为文件名: ```xml <build> <finalName>${project.artifactId}</finalName> </build> ``` 此配置会强制Maven使用`artifactId`作为打包后的文件名[^2][^4]。 3. **保存文件并执行打包命令** 运行`mvn clean package`后,生成的war/jar文件名称将变为`项目ID.war`或`项目ID.jar`,例如原名为`app-1.0.0.jar`会变为`app.jar`。 ### 验证效果 ```bash # 打包前文件名示例 cloud-0.0.1-SNAPSHOT.war # 配置后文件名 cloud.war ``` ### 注意事项 - 若配置后未生效,请检查`<finalName>`是否放置在`<build>`标签内正确位置 - 多模块项目中需在主`pom.xml`或子模块中分别配置 - 该配置对所有打包类型(jar/war)均有效[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值