侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

maven源码打包技巧,同时打包class文件及java文件

孔子说JAVA
2022-05-14 / 0 评论 / 0 点赞 / 300 阅读 / 10,755 字 / 正在检测是否收录...

通常我们使用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文件中添加如下代码即可。

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,单独打包源码。

执行结果:

image-1652234341779

安装时,会同时将源码包安装到本地仓库,效果图如下:

image-1652234455859

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也可以达到这个目的。

image-1652253558053

由上图可以看到,所有.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。

Resources插件目标有三个:

  1. resources:resources,拷贝main resources到main output directory。它绑定了process-resources生命周期阶段,当执行Compiler:compile插件目标前就会执行此阶段。
  2. resources:testResources,拷贝test resources到test output directory。它绑定了process-test-resources生命周期阶段,当执行surefire:test插件目标前就会执行此阶段。
  3. 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文件。

image-1652237417812

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>
0

评论区