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

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

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)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 252 关注

相关帖子

欢迎来到这里!

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

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