通常我们使用maven打包应用时,只会将编译后生成的文件打包,源代码是不会被打包的,但有时我们却需要将源代码打包进行分享,那该如何操作呢?本文主要介绍如何将源码单独打包为jar包以及编译文件及源码一起打包的技巧。
1、单独将源码打包为jar包
1.1 命令行方式
进入cmd命令行,进入项目工程pom.xml所在路径目录,运行 mvn source:jar
可以将源代码打包成jar包,运行 mvn source:test-jar
可以将单元测试代码打包为test-jar。
- 此方法只生成到项目目录下,不拷贝到仓库。
- 扩展:
mvn javadoc:jar
打包文档
将源代码打包成jar包
mvn clean source:jar
打包完成后可以看到在target目录下的编译jar包为***.jar,源码jar包为***-sources.jar。
将单元测试代码打包成jar包
mvn clean source:test-jar
打包完成后可以看到在target目录下的编译jar包为
***.jar
,源码jar包为***-sources.jar
。
1.2 使用maven-source-plugin插件打包
maven-source-plugin提供项目自动将源码打包并发布的功能,在需要发布源码项目的pom.xml文件中添加如下代码即可。
- 注意:在多项目构建中,将source-plugin置于顶层或parent的pom中并不会发挥作用,必须置于具体项目的pom中。
- Plugin: http://maven.apache.org/plugins/maven-source-plugin/
The Source Plugin has five goals:
- source: aggregate aggregrates sources for all modules in an aggregator project.
- source:jar is used to bundle the main sources of the project into a jar archive.
- source:test-jar on the other hand, is used to bundle the test sources of the project into a jar archive.
- source:jar-no-fork is similar to jar but does not fork the build lifecycle.
- source:test-jar-no-fork is similar to test-jar but does not fork the build lifecycle.
pom.xml 配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
上述配置中指定了phase为compile,意思是在生命周期compile的时候就将源文件打包,即只要执行的mvn命令包括compile这一阶段,就会将源代码打包。同样,phase还可以指定为package、install等等。
- 执行 mvn install,maven会自动将source install到repository 。
- 执行 mvn deploy,maven会自动将source deploy到remote-repository 。
- 执行 mvn source:jar,单独打包源码。
执行结果:
安装时,会同时将源码包安装到本地仓库,效果图如下:
2、将源码及编译文件打为一个jar包
maven打包,在生成的jar包中带有源代码。记住,这个带源代码的意思是源代码和编译生成的文件放在一个jar文件里面,而不是单独的一个xxx-source.jar包。
2.1 方式一:把源代码当作资源文件
默认情况下,Maven会从项目的src/main/resources目录下查找资源
Project
|-- pom.xml
`-- src
`-- main
`-- resources
我们可以通过 <resource>
指定需要读取的资源。
<build>
<build>
<!--添加resource配置-->
<resources>
<resource>
<!--从此目录下读取全部以.properties、.xml、.yml开头的文件-->
<directory>src/main/resources/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
</resource>
<resource>
<!--从此目录下读取全部以.java、.properties、.xml、.yml开头的文件-->
<directory>src/main/java/</directory>
<includes>
<include>**/*.java</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
</build>
在上面的pom代码块中,我们看到maven的很多标签,其中resources标签是指定读取的配置文件或文件夹中的文件,这里其实是maven-resources-plugin来处理的,当然你也可以不使用resources标签来实现读取配置文件,通过maven-resources-plugin也可以达到这个目的。
由上图可以看到,所有.java文件和.class文件一起被打到了jar包。
2.2 方式二:使用maven-resources-plugin插件打包
2.2.1 将class文件和源文件一起打包
Resources插件负责处理项目资源文件并拷贝到输出目录。Maven将main resources和test resources分开,一般main resources关联main source code,而test resources关联test source code。
- 官方文档:http://maven.apache.org/plugins/maven-resources-plugin/
- 该方式的效果和方式一是一样的。
Resources插件目标有三个:
- resources:resources,拷贝main resources到main output directory。它绑定了process-resources生命周期阶段,当执行Compiler:compile插件目标前就会执行此阶段。
- resources:testResources,拷贝test resources到test output directory。它绑定了process-test-resources生命周期阶段,当执行surefire:test插件目标前就会执行此阶段。
- resources:copy-resources,手动拷贝资源到输出目录
pom.xml 配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<resources>
<resource>
<directory>src/main/java/</directory>
<includes>
<include>**/*.java</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在上面的pom代码块中,可以看到有很多标签,我们介绍几个关键的:
- phase为process-resources,绑定了process-resources生命周期阶段,当执行Compiler:compile插件目标前就会执行此阶段。
- 目标goal:使用resources插件的copy-resources目标在其他阶段拷贝进行资源文件的copy
- configuration标签指定了maven-resources-plugin插件打包时需拷贝的文件,表示从
<resources>
标签指定的文件拷贝到<outputDirectory>
指定的目录中。如果没有指定这个标签及其下面的配置,则打包后的jar中不会包括.java
文件。 - resource标签指定了打包时需要拷贝的文件,这里指定了directory(目录)为
src/main/java/
,includes指定了**/*.java
,表示所有目录的.java
文件。这2个标签合起来表示的意思就是指定了src/main/java/
目录下的所有.java
文件,包括所有子目录。 - resources标签可以指定多个resource。
- outputDirectory标签指定了resources标签内指定的文件需要拷贝到的目录,
${project.build.directory}/classes
表示将resource标签指定的java文件拷贝到了target/classes目录下。这样打包的时候classes目录中就包括了.java
文件。(.class
文件和默认资源文件不需要特别指定,已经默认包含)。
执行 mvn clean package
命令或通过idea等工具执行maven打包操作后,可以看到在target目录下生成了jar包,我们用压缩软件打开jar包查看,可以看到该jar包中既包括class文件也包括java文件。
2.2.2 打包技巧-指定编码方式
可以指定resources插件读取和写入文件的字符编码,比如 ASCII, UTF-8 或 UTF-16。也可以指定${project.build.sourceEncoding}
属性
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
也可以通过 <configuration>
指定编码
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
2.2.3 打包技巧-指定资源位置
默认情况下,Maven会从项目的src/main/resources目录下查找资源。如果你的资源不在此目录下,可以用<resources>
标签指定,同时也支持多个目录。
<build>
<resources>
<resource>
<directory>src/main/resources1</directory>
</resource>
<resource>
<directory>src/main/resources2</directory>
</resource>
</resources>
</build>
2.2.4 打包技巧-资源变量引用
有的时候,资源文件中存在变量引用,可以使用<filtering>
标签指定是否替换资源中的变量。变量的来源为pom文件中的<properties>
标签中定义的变量。也可以在<build>
中定义过滤器资源。
<build>
<filters>
<filter>filter-values.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.2.5 打包技巧-包含和排除资源
可能目录下的资源文件都需要被使用,可以使用<includes>
和<excludes>
来精细控制。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.rtf</include>
</includes>
<excludes>
<exclude>**/*.bmp</exclude>
<exclude>**/*.jpg</exclude>
<exclude>**/*.jpeg</exclude>
<exclude>**/*.gif</exclude>
</excludes>
</resource>
<resources>
</build>
2.2.6 打包技巧-特殊字符处理
如果资源中本来存在${}
字符,不需要被替换,可以在$
前加\
,并在<configuration>
中使用<escapeString>
。
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<escapeString>\</escapeString>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugins>
2.2.7 打包技巧-排除二进制文件
如果目录下存在二进制文件,需要排除,也可以在<configuration>
中使用<nonFilteredFileExtensions>
根据后缀来过滤。
<!-- 过滤后缀为pdf和swf的文件 -->
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugins>
3、maven常见插件了解
3.1 jetty-maven-plugin
maven的jetty插件,直接利用插件启动web项目
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.7.v20150116</version>
<configuration>
<!--指定项目热部署刷新时间-->
<scanIntervalSeconds>3</scanIntervalSeconds>
<webApp>
<!--web项目访问路径 http://localhost/-->
<contextPath>/</contextPath>
</webApp>
<httpConnector>
<!--部署端口-->
<port>80</port>
</httpConnector>
<!--自动热部署-->
<reload>automatic</reload>
</configuration>
</plugin>
3.2 tomcat7-maven-plugin
maven的tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>webapp</warSourceDirectory>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
3.3 maven-surefire-plugin
测试插件
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--跳过测试-->
<skipTests>true</skipTests>
</configuration>
</plugin>
3.4 mabatis-generate-maven-plugin
mybatis逆向工程插件
<!-- mybatis-generator:generate -e 运行mybatis的generator插件的命令,-e是显示详细信息 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis-generator-core.version}</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
</configuration>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</plugin>
3.5 apt-maven-plugin
querydsl Q对象生成插件
<plugin>
<!-- Q对象生成插件 -->
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<!--<sourceDirectory>entities</sourceDirectory>-->
<outputDirectory>querydsl-sources</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
</plugin>
评论区