• maven常用插件


    一. 自带核心插件

    https://maven.apache.org/plugins/

    二. 第三方插件

    1.maven-assembly-plugin

    http://maven.apache.org/plugins/maven-assembly-plugin/

    (1)打包独立运行的jar文件

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <!-- 配置main方法入口程序 -->
                    <mainClass>org.chench.Main</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    特别注意
    如果在项目中使用了Spring框架,在通过maven-assembly-plugin打包成独立可执行的jar包后,在执行时可能报如下错误:

    Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace 
    

    这其实是maven-assembly-plugin的一个BUG,详见:https://issues.apache.org/jira/browse/MASSEMBLY-360
    解决方案:使用maven-shade-plugin插件进行打包。

    (2)打包压缩文件

    maven-assembly-plugin插件除了可以打包项目为可独立运行的jar文件,还可以将项目打包为压缩文件。

    <!-- 部署打包: 通过maven-assembly插件压缩为tar包进行发布 -->
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <appendAssemblyId>false</appendAssemblyId>
            <attach>false</attach>
            <descriptors>
                <descriptor>assembly.xml</descriptor>
            </descriptors>
            <finalName>${project.name}-${project.version}</finalName>
            <outputDirectory>${basedir}/release</outputDirectory>
        </configuration>
        <executions>
            <execution>
                <id>assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    assembly.xml配置:

    <assembly
    	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    	<id>distribution</id>
    	<formats>
            <!-- 压缩包格式 -->
    		<format>tar.gz</format>
    		<!-- <format>zip</format> -->
    	</formats>
    	
        <!-- 打包文件参数配置 -->
    	<fileSets>
    		<!-- 脚本 -->
    		<fileSet>
    			<directory>${basedir}/src/main/bin</directory>
    			<outputDirectory>bin</outputDirectory>
    			<includes>
    				<include>*.bat</include>
    				<include>*.sh</include>
    			</includes>
    			<fileMode>0755</fileMode>
    		</fileSet>
    		
    		<!-- sql文件 -->
    		<fileSet>
    			<directory>${basedir}/src/main/sql</directory>
    			<outputDirectory>sql</outputDirectory>
    			<includes>
    				<include>*.sql</include>
    			</includes>
    		</fileSet>
    		
    		<!-- jdbc.properties, logback.xml -->
    		<fileSet>
    			<directory>${basedir}/src/main/resources/profiles/${profile.dir}</directory>
    			<outputDirectory>conf</outputDirectory>
    			<includes>
    				<include>jdbc.properties</include>
    				<include>logback.xml</include>
    			</includes>
    		</fileSet>
    		
    		<!-- INSTALL,README,change.log -->
    		<fileSet>
    			<directory>${basedir}</directory>
    			<outputDirectory></outputDirectory>
    			<includes>
                    <include>INSTALL</include>
    				<include>README.md</include>
    				<include>change.log</include>
    			</includes>
    		</fileSet>
    		
    		<!-- 日志目录 -->
    		<fileSet>
    			<directory>target</directory>
    			<outputDirectory>logs</outputDirectory>
    			<excludes>
    				<exclude>**/*</exclude>
    			</excludes>
    		</fileSet>
    		
    		<!-- 临时目录 -->
    		<fileSet>
    			<directory>target</directory>
    			<outputDirectory>temp</outputDirectory>
    			<excludes>
    				<exclude>**/*</exclude>
    			</excludes>
    		</fileSet>
    	</fileSets>
    	<dependencySets>
    		<dependencySet>
    			<outputDirectory>lib</outputDirectory>
    			<excludes>
    				<exclude>junit:junit</exclude>
    			</excludes>
    		</dependencySet>
    	</dependencySets>
    	
    	<includeBaseDirectory>true</includeBaseDirectory>
    	<baseDirectory>${project.name}-${project.version}</baseDirectory>
    </assembly>
    

    2. maven-shade-plugin

    https://maven.apache.org/plugins/maven-shade-plugin/

    打包可独立运行的jar文件

    <!-- 打包可执行jar文件 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>org.chench.Main</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    对于使用了Spring框架的项目,如果在执行java -jar package.jar时报错:

    Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace
    

    原因:如果在多个jar包中存在同名文件,如:mybatis-spring.jar和spring-context.jar中都存在META-INF/spring.schemas,maven在执行打包时
    可能会使用mybatis-spring.jar中的spring.schemas覆盖掉spring-context.jar中的spring.schemas。
    显然,mybatis-spring.jar中的spring.schemas定义的命名空间与spring-context.jar中spring.schemas定义的命名空间是不同的。
    这会导致在加载Spring容器时无法找到合适的命名空间!
    为了解决这个问题,可以在maven-shade-plugin中通过Resource Transformers将所有的spring.schemas文件中的内容都合并到一起。

    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
        <resource>META-INF/spring.handlers</resource>
    </transformer>
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
        <resource>META-INF/spring.schemas</resource>
    </transformer>
    

    完整配置:

    <!-- 打包可执行jar文件 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>org.chench.Main</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    详见:https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer

    3. maven-dependency-plugin

    https://maven.apache.org/plugins/maven-dependency-plugin/
    通过该插件可以对被依赖组件进行复制,解压等一系列操作。

    场景一: 在Maven多模块化项目中,可以使用maven-dependency-plugin将被依赖模块jar文件中class文件提取出来放在指定位置。

    <!-- 将依赖模块的jar包文件提取出来放到指定位置 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>unpack</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>unpack</goal>
                </goals>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>com.xxx</groupId>
                            <artifactId>xxx-xxx</artifactId>
                            <version>1.0.0</version>
                            <type>jar</type>
                            <includes>**/*.class</includes>
                            <overWrite>false</overWrite>
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        </artifactItem>
                    </artifactItems>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    场景二:将scope为system的依赖jar包一起打包

    <!-- 打包scope为system的jar包 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.2</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <includeScope>system</includeScope>
                <outputDirectory>${project.build.directory}/classes</outputDirectory>
            </configuration>
    </plugin>
    

    场景三:将scope为system的依赖jar包中的class文件解压出来重新打包

    <!-- 将scope为system的依赖jar包中的class文件解压出来重新打包 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
            <execution>
                <id>unpack</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>unpack-dependencies</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <includeScope>system</includeScope>
            <outputDirectory>${project.build.directory}/classes</outputDirectory>
        </configuration>
    </plugin>
    

    4. maven-resources-plugin

    https://maven.apache.org/plugins/maven-resources-plugin/
    maven默认使用该maven-resources-plugin资源文件,不需要明确配置。

    <resources>
        <resource>
            <!-- 指定资源目录 -->
            <directory>src/main/resources</directory>
            <!-- 不打包指定类型的资源 -->
            <excludes>
                <exclude>**/*.svn</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources/profiles/${profile.dir}</directory>
            <includes>
                <include>*.properties</include>
            </includes>
        </resource>
    </resources>
    

    5. maven-jar-plugin

    https://maven.apache.org/plugins/maven-jar-plugin/usage.html
    使用该插件可以在打包jar文件时做一些事情,比如:定义MANIFEST.MF文件,过滤文件等。

    <!-- 生成jar包时打包资源文件配置 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
            <excludes>
                <exclude>**/profiles/**</exclude>
                <exclude>**/jdbc.properties</exclude>
                <exclude>**/*.proto</exclude>
            </excludes>
        </configuration>
    </plugin>
    

    6. maven-source-plugin

    https://maven.apache.org/plugins/maven-source-plugin/usage.html

    打包项目源码。

    <!-- 打包源码 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
            <execution>
                <id>attach-sources</id>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    7. maven-compiler-plugin

    https://maven.apache.org/plugins/maven-compiler-plugin/usage.html
    打包时设置编译参数。

    <!-- 打包编译参数 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.1</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
    

    【参考】
    http://blog.csdn.net/bluishglc/article/details/6085209 使用assembly打出的独立可执行jar包启动时报错spring错误的解决方法
    http://www.trinea.cn/android/maven-plugin/ Maven常用插件配置和使用
    http://www.jianshu.com/p/861c0d3697d0 maven-assembly-plugin打包spring项目运行报错解决

  • 相关阅读:
    【汇编程序】出地址为BUF的5个字符数组的内容之和
    Ugly Number
    Best Time to Buy and Sell Stock IV****
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock II
    House Robber II
    Contain Duplicate III*******
    Contain Duplicate II
    Contain Duplicate
  • 原文地址:https://www.cnblogs.com/nuccch/p/7723130.html
Copyright © 2020-2023  润新知