使用 maven 打包遇到的一些问题

本贴最后更新于 2366 天前,其中的信息可能已经时移世异

1. 源代码路径和资源文件路径

  • sourceDirectory: 指定源代码所在路径
    • 默认为 src/main/java
  • testSourceDirectory:测试代码所在路径
    • 默认为 src/test/java
  • outputDirectory : 编译后的 classes 存放路径
    • 默认为 target/classes
  • resources : 所有资源文件的目录
    * 配置多个 resource
    * 默认为 src/main/resources,源代码目录下的资源文件会被过滤掉,如果资源文件和源代码放在了一块,则需要配置
```xml
<resources>
	<resource>
		<directory>src/main/java</directory>
		<includes>
			<include>**/*.xml</include>
			<include>**/*.properties</include>
		</includes>
	</resource>
	<resource>
		<directory>src/main/resources</directory>
	</resource>
  </resources>

```

2. maven 使用本地 jar 包

  • 使用本地的 jar 包有两种方式:
    1. 将 jar 包安装进 maven 的仓库
      安装命令如下:
        mvn install:install-file \
        -DgroupId=org.hibernate \
        -DartifactId=c3p0 \
        -Dversion=4.2.4.Final-Dpackaging=jar \
        -Dfile=hibernate-c3p0-4.2.4.Final.jar 
      
      • 分别指定 groupId,artifactId,version,和文件路径(当前路径下的该 jar)
    2. dependency 的 scope 使用 system,同时指定 jar 包位置
     <dependency>
    	<groupId>com.flyue</groupId>  <!--自定义-->
    	<artifactId>message</artifactId>    <!--自定义-->
    	<version>1.0</version> <!--自定义-->
    	<scope>system</scope> <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
    	<systemPath>${basedir}/src/main/resources/lib/message.jar</systemPath>  <!--项目根目录下的lib文件夹下-->
    </dependency>
    

3. 插件的使用

3.1 项目编译时使用的 jdk 版本以及源代码使用的编码

* 使用 __maven-compiler-plugin__  插件
  ```xml
  <plugin>
	  <groupId>org.apache.maven.plugins</groupId>
	  <artifactId>maven-compiler-plugin</artifactId>
	  <version>3.7.0</version>
	  <configuration>
		  <source>1.8</source>
		  <target>1.8</target>
		  <encoding>utf-8</encoding>
	  </configuration>
  </plugin>
  
  ```

3.2 打包成 jar 使用的插件 maven_jar_plugin

* 使用 __mvn jar:jar__ 命令打包
* 使用该插件打包时只会打包自身的class和资源文件,依赖的jar包与资源文件不会一起打包。
```xml
  <plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-jar-plugin</artifactId>  
        <version>2.6</version>  
        <configuration>  
            <archive>  
                <manifest> 
		<!-- 主要影响jar包中的META-INF/MANIFEST.MF-->
		<!-- 是否追加classpath路径 -->
                    <addClasspath>true</addClasspath>  
		<!-- 追加的classpath所在路径 -->			
                    <classpathPrefix>lib/</classpathPrefix>  
		<!-- 指定main方法所在类,直接使用java -jar命令运行jar包时依赖这些配置 -->			
                    <mainClass>com.xxg.Main</mainClass>  
                </manifest>  
            </archive>
	<!-- 指定jar的分类器,用于依赖是区别不同的包 -->
	<classifier>classes</classifier>
        </configuration>  
    </plugin
```

3.3 打成 war 包 maven_war_plugin

  1. 遇到需要将两个 webapp 项目 A,B 同时打成一个 war 包的需求,同时 B 依赖 A
    • 目前的主要步骤是:
      • A 需要打成 jar 与 war 包同时安装到 maven 仓库中,打 jar 包需要指定分类器 classifier
      • B 项目依赖 A 项目的 jar 包,使得 B 能引用 A 项目的类,scope 设置为 provided,打包时不需要这个 jar
      • B 项目依赖 A 项目的 war 包,使用 maven_war_plugin 插件合并两个 war 包
      • maven_war_plugin 的合并两 war 包配置如下:
        <!-- 合并多个war -->
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-war-plugin</artifactId>
             <version>3.2.0</version>
             <executions>
                 <execution>
                     <!--绑定到maven 的生命周期package上 -->
                     <!-- 当进行package时,会调用war-plugin进行打包 -->
                     <phase>package</phase>
                 </execution>
             </executions>
             <configuration>
                 <!-- web.xml不合并 -->
                 <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
                 <overlays>
                     <!-- 合并的war包地址,overlays下可以写多个 -->
                     <overlay>
                         <groupId>com.xxx</groupId>
                         <artifactId>xxx</artifactId>
                     </overlay>
                     <!--<overlay>
                         <groupId></groupId>
                         <artifactId></artifactId>
                     </overlay>-->
                 </overlays>
             </configuration>
         </plugin>
      

3.4 自定义打包 maven_assembly_plugin :

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-assembly-plugin</artifactId>
 <version>3.1.0</version>
 <executions>  <!--执行器 mvn assembly:assembly-->
 	<execution>
 		<id>make-war</id><!--名字任意 -->
 		<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
 		<goals>
 			<goal>single</goal><!-- 只运行一次 -->
 		</goals>
 		<configuration>
 			<descriptors> <!--打包配置的描述文件路径-->
 				<descriptor>src/main/assembly/src.xml</descriptor>
 			</descriptors>
 		</configuration>
 	</execution>
 </executions>
</plugin>
  • src/main/assembly/src.xml 配置

    • 将依赖的指定的 jar 包解压和项目编译后的代码一同放到 classes 下示例
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
 <id>release</id>
 <formats>
     <!-- 将项目打成war包 -->
     <format>war</format>
 </formats>

 <!-- 设置自身项目文件目录 -->
 <fileSets>
     <fileSet>
         <!-- 将编译后的classes放到WEB-INF/classes下 -->
         <directory>target/classes</directory>
         <outputDirectory>/WEB-INF/classes/</outputDirectory>
     </fileSet>
     <fileSet>
         <!-- webapp 下的文件到根目录 -->
         <directory>src/main/webapp</directory>
         <outputDirectory>/</outputDirectory>
     </fileSet>
 </fileSets>

 <!-- 设置依赖的放置目录 -->
 <dependencySets>
     <dependencySet>
         <!-- 项目自身不考虑进去 -->
         <useProjectArtifact>false</useProjectArtifact>
         <outputDirectory>/WEB-INF/lib/</outputDirectory><!-- 将scope为runtime的依赖包打包到lib目录下。 -->
         <excludes>
             <!-- 排除掉一些jar包,用groudId:artifactId方式 -->
             <exclude>
                 com.taotao
             </exclude>
         </excludes>
     </dependencySet>
     <dependencySet>
         <!-- 项目自身不考虑进去 -->
         <useProjectArtifact>false</useProjectArtifact>
         <outputDirectory>/WEB-INF/classes/</outputDirectory>
         <!-- 将依赖解压 -->
         <unpack>true</unpack>
         <unpackOptions>
             <includes>
                 <include>com/taotao/**</include>
             </includes>
         </unpackOptions>
         <includes>
             <include>
                 com.taotao
             </include>
         </includes>
     </dependencySet>
 </dependencySets>
</assembly>

3.5 maven 的 jetty 插件:

   <plugin>
  	<groupId>org.eclipse.jetty</groupId>
  	<artifactId>jetty-maven-plugin</artifactId>
  	<version>9.4.5.v20170502</version>
  	<configuration>
  		<scanIntervalSeconds>10</scanIntervalSeconds>
  		<httpConnector>
  			<port>8080</port>
  		</httpConnector>
  		<webApp>
  			<contextPath>/</contextPath>
  		</webApp>
  	</configuration>
  </plugin>
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 282 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...