maven的打包插件介绍

691 阅读2分钟

0.jar依赖项文件说明

image.png

可执行文件样例

  1. class-path是依赖包 用空格隔开
  2. 指定main函数入口
  3. 最后一行一定要回车,空一行,不然无法识别最后一行的配置
Manifest-Version: 1.0
Class-Path: lib/commons-cli-1.4.jar lib/javassist-3.30.2-GA.jar lib/as
 m-9.7.jar lib/asm-util-9.7.jar lib/asm-tree-9.7.jar lib/asm-analysis-
 9.7.jar lib/asm-commons-9.7.jar lib/byte-buddy-1.14.18.jar lib/byte-b
 uddy-agent-1.14.18.jar lib/commons-codec-1.17.1.jar lib/commons-lang3
 -3.16.0.jar
Build-Jdk-Spec: 1.8
Created-By: Maven JAR Plugin 3.3.0
Main-Class: com.soap.agent.vm.MyAgentVMMain

agent文件样例

  1. Premain-Class配置agent的入口函数
  2. 最后一行一定要回车,空一行,不然无法识别最后一行的配置
Manifest-Version: 1.0
Premain-Class: com.soap.agent.BuddyAgent
Agent-Class: com.soap.agent.BuddyAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0

1.依赖项jar单独打包

  1. 插件maven-dependency-plugin
  2. ${project.build.directory} 是pom的当前路径。
  3. 如果有module在父目录执行pom时是父目录路径,在module执行是module路径
  4. 这个打包会把依赖的包放到当前target的lib目录中
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>

2.jar包的两种方式

1.依赖项class打包方式一

  1. 插件maven-assembly-plugin
  2. 也可以指定main函数入口
            <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <!--                  填写你的main方法所在的主类-->
                        <mainClass>
                            com.soap.agent.vm.MyAgentVMMain
                        </mainClass>
                    </manifest>
                </archive>
                 <!--依赖会以calsses方式打进jar包-->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

2.依赖项class打包方式二

  1. 插件maven-shade-plugin
  2. 单独的maven-jar-plugin 没有依赖项
  3. 这个是把依赖依赖项的class打进去
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

3.依赖项lib文件的方式

  1. 插件maven-jar-plugin
  2. 制定了依赖的lib路径
  3. 指定main入口函数
  4. 可以配合maven-dependency-plugin 或者 maven-shade-plugin 使用
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.soap.agent.vm.MyAgentVMMain</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
  1. jar包直接输出在指定的目录中
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<!-- 指定打包的jar包输出路径 -->
		<outputDirectory>D:\test</outputDirectory>
		<!--不打入jar包的文件类型或者路径 -->
		<excludes>
			<exclude>**/*.properties</exclude>
			<exclude>**/*.xml</exclude>
			<exclude>**/*.yml</exclude>
			<exclude>static/**</exclude>
			<exclude>templates/**</exclude>
		</excludes>
	</configuration>
</plugin>

3.agent的jar打包两种方式同上

  1. maven-jar-plugin方式打agent包
  2. 指定一些agent的属性
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
            </manifest>
            <manifestEntries>
                <Premain-Class>com.soap.agent.BuddyAgent</Premain-Class>
                <Agent-Class>com.soap.agent.BuddyAgent</Agent-Class>
                <Can-Redefine-Classes>true</Can-Redefine-Classes>
                <Can-Retransform-Classes>true</Can-Retransform-Classes>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>
  1. maven-assembly-plugin方式打agent包
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <!--避免MANIFEST.MF被覆盖-->
            <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
       <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>

    <executions>
        <execution>
            <goals>
                <goal>attached</goal>
            </goals>
            <phase>package</phase>
        </execution>
    </executions>
</plugin>

6.资源文件复制

  1. 插件maven-resources-plugin
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-resources-plugin</artifactId>
   <executions>
      <execution>
         <id>copy-resources</id>
         <phase>prepare-package</phase>
         <goals>
            <goal>copy-resources</goal>
         </goals>
         <configuration>
            <encoding>UTF-8</encoding>
            <!--要复制到的路径-->
            <outputDirectory>
               ${project.build.directory}/target/lib
            </outputDirectory>
            <!-- 复制的文件路径-->
            <resource>
              <directory>src/main/resources</directory>
                <!--排除-->
                <excludes>
                 <exclude>**/*.jar</exclude>
                </excludes>
           </resource>
           <resource>
            <directory>target</directory>
           </resource>
            <overwrite>true</overwrite>
         </configuration>
      </execution>
   </executions>
</plugin>

7.modules的jar包复制到指定目录

  1. maven-antrun-plugin复制文件
  2. 文件过滤 注意路径在根目录下运行pom会把module/target下的jar包复制过去
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>install</id>
            <phase>install</phase>
            <configuration>
                <target>
                    <!--会输出路径-->
                    <echo message="*******************install*******************${project.build.directory} ${basedir}/target"  />
                    <!--<mkdir dir="${basedir}/target/classes" />-->
                    <copy todir="${basedir}/../target/" overwrite="true">
                        <fileset dir="${project.build.directory}"
                                 erroronmissingdir="false">
                            <include name="*.jar" />
                        </fileset>
                    </copy>
                    <!-- <move file="${project.build.directory}/xxxxxxx.jar"
                           tofile="${project.build.directory}/xxx.jar" />-->
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
    </executions>
</plugin>