mvn 实战: 如何用pom.xml来调用maven打包java工程(自动打包依赖的包和配置文件)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bigtree_3721/article/details/81223677

背景:

1,生成3个目录/lib,/conf,/bin目录

2,把所有的jar目录编译、拷贝到/lib目录(包括maven的jar包和lib目录下的jar,以及编译的jar包)

3,把所有的启动脚本从工程根目录拷贝到/bin目录

4,把所有的配置文件从src/main/resources拷贝到/conf

下面是配置的pom.xml,相关的配置都加了注释,一看就能明白,把build节点拷贝到你们的项目中,就基本可以用了:)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test.common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>test.common</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
    <!-- 这里省略n行 -->
    </dependencies>
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <resources>
            <!-- 把src/main/resources目录下所有的文件拷贝到conf目录中 -->
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>${project.build.directory}/conf</targetPath>
            </resource>
            <!-- 把lib目录下所有的文件拷贝到lib目录中
            (可能有些jar包没有办法在maven中找到,需要放在lib目录中) -->
            <resource>
                <directory>lib</directory>
                <targetPath>${project.build.directory}/lib</targetPath>
            </resource>
            <!-- 把放在根目录下的脚本文件.sh,.bat拷贝到bin目录中 -->
            <resource>
                <directory>.</directory>
                <includes>
                    <include>**/*.sh</include>
                    <include>**/*.bat</include>
                </includes>
                <targetPath>${project.build.directory}/bin</targetPath>
            </resource>
        </resources>

        <plugins>
            <!-- 用于编译的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <fork>true</fork>
                    <defaultLibBundleDir>lib</defaultLibBundleDir>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                    <!-- 如果配置了JAVA_HOME,下面应该可以不用配 -->
                    <executable>C:\Program Files (x86)\Java\jdk1.8.0_91\bin\javac.exe</executable>
                </configuration>
            </plugin>
            
            <!-- 用于生成jar包的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <!-- 把生成的jar包放在lib目录下(和其他所有jar包一起) -->
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                    <excludes>
                    <!-- 排除掉一些文件,不要放到jar包中,
                    这里是为了排除掉src/main/resources中的文件(它们应该放到conf目录)
                    这里只能指定要排除的目标文件,而不能指定源文件,虽然不够完美,但是基本能达到目的。 -->
                        <exclude>*.xml</exclude>
                        <exclude>*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin>
            
            <!-- 用于拷贝maven依赖的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                        <!-- 把依赖的所有maven jar包拷贝到lib目录中(这样所有的jar包都在lib目录中) -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            
            <!-- 用于拷贝resource的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- 配置生成源代码jar的plugin -->
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <attach>true</attach>
                    <encoding>UTF-8</encoding>
                    <!-- 配置源代码jar文件的存放路径,和其他jar文件一起放在lib目录 -->
                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
        </plugins>
    </build>
</project>

然后执行  mvn -Dmaven.test.skip=true  -Upackage 打包。

如果是eclipse,在Project Explorer-> Run As –> Maven Build… –>在Goals中输入package,点Run进行编译。

在bin目录下的启动脚本start.bat可以这么写:

@ECHO OFF set CLASSPATH=%JAVA_HOME%/lib set JAVA=%JAVA_HOME%/bin/java set CLASSPATH=%CLASSPATH%;../conf set JAVA_OPTIONS=-Djava.ext.dirs="../lib" "%JAVA%" -Xms512m -Xmx1024m -classpath "%CLASSPATH%" %JAVA_OPTIONS% test.HangqingEntrance

参考文档:

1. mvn 依赖官方网站:http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-source-plugin

2. mvn 依赖包用法:http://maven.apache.org/plugins/index.html

3. mvn 打jar包时,如何把所有的工程依赖的jar包都打在一个jar包里,见 http://chenzhou123520.iteye.com/blog/1706242

注:该文章得用下面的<goal>single</goal>, 文中的 assemble在新版本会报错!要参考这批文章去打包。

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

<executions>
 <execution>
    <id>make-assembly</id> <!-- this is used for inheritance merges -->
    <phase>package</phase> <!-- bind to the packaging phase -->
     <goals>
        <goal>single</goal>
     </goals>
  </execution>
</executions>

注:

 如果要把java代码的产生的class,以及依赖的jar包,配置文件都打成一个jar文件,则可以参考下面的我的pom.xm文件。

运行 mvn -Dmaven.test.skip=true  -Upackage 即可打成单个的jar包(包含所有的依赖包和配置文件)。

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>mysender</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven-plugins.version>3.1.1</maven-plugins.version>
        <maven-jar.version>3.1.0</maven-jar.version>
        <maven-compiler.version>3.7.0</maven-compiler.version>
        <maven-resource.version>3.0.1</maven-resource.version>
        <maven-source.version>3.0.1</maven-source.version>
        <maven-dependency.version>3.1.1</maven-dependency.version>
        <maven-assembly.version>3.1.0</maven-assembly.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-streams</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>1.5.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>

   <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-dependency-plugin -->
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>${maven-plugins.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>${maven-jar.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${maven-resource.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>${maven-source.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>${maven-dependency.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>${maven-assembly.version}</version>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <finalName>kafksender</finalName>
        <defaultGoal>package</defaultGoal>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>${project.build.directory}/conf</targetPath>
                <includes>
                  <include>**/*</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>application.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <!-- 把lib目录下所有的文件拷贝到lib目录中
           (可能有些jar包没有办法在maven中找到,需要放在lib目录中) -->
            <resource>
                <directory>lib</directory>
                <targetPath>${project.build.directory}/lib</targetPath>
            </resource>
            <!-- 把放在根目录下的脚本文件.sh,.bat拷贝到bin目录中 -->
            <resource>
                <directory>.</directory>
                <includes>
                    <include>**/*.sh</include>
                    <include>**/*.bat</include>
                </includes>
                <targetPath>${project.build.directory}/bin</targetPath>
            </resource>
        </resources>

        <plugins>
            <!-- 用于编译的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler.version}</version>
                <configuration>
                    <fork>true</fork>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!-- don't append suffix jar-with-dependencies to jar file-->
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!-- 此处指定main方法入口的class -->
                            <mainClass>mysender</mainClass>
                        </manifest>
                    </archive>
                     </configuration>
                <executions>
                    <execution>
                 <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- 用于生成jar包的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven-jar.version}</version>
                <configuration>
                    <!-- 把生成的jar包放在lib目录下(和其他所有jar包一起) -->
                    <outputDirectory>${project.build.directory}/</outputDirectory>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>kafksender</mainClass>
                        </manifest>
                    </archive>
                    <excludes>
 <!-- 排除掉一些文件,不要放到jar包中, 这里是为了排除掉src/main/resources中的文件(它们应该放到conf目录) 这里只能指定要排除的目标文件,而不能指定源文件,虽然不够完美,但是基本能达到目的。 -->
                        <exclude>*.xml</exclude>
                        <exclude>*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin> 
            <!-- 用于拷贝maven依赖的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven-dependency.version}</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
             <!-- 把依赖的所有maven jar包拷贝到lib目录中(这样所有的jar包都在lib目录中) -->                      <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 用于拷贝resource的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>${maven-resource.version}</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!-- 配置生成源代码jar的plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>${maven-source.version}</version>
                <configuration>
                    <!-- 配置源代码jar文件的存放路径,和其他jar文件一起放在lib目录 -->
                    <outputDirectory>${project.build.directory}/</outputDirectory>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <filters>
                    <filter>src/main/resources/application-dev.properties</filter>
                </filters>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <filters>
                    <filter>src/main/resources/application-prod.properties</filter>
                </filters>
            </build>
        </profile>
    </profiles>
    <distributionManagement>
        <repository>
            <id>Releases</id>
            <name>maven-releases</name>
            <url>http://10.70.27.14:8081/repository/Releases/<;/url>
        </repository>
        <snapshotRepository>
            <id>Snapshots</id>
            <name>maven-snapshots</name>
            <url>http://10.70.27.14:8081/repository/Snapshots/<;/url>
        </snapshotRepository>
    </distributionManagement>
</project>

猜你喜欢

转载自blog.csdn.net/bigtree_3721/article/details/81223677