maven 项目打包配置(build节点)
参考博客:https://www.cnblogs.com/Binhua-Liu/p/5604841.html
https://www.cnblogs.com/f-zhao/p/6929814.html
配置总结: 一 jar包位置 1.把lib目录下所有的文件(外部依赖的jar) 2.依赖的所有maven jar包 3.可运行的工程jar文件的存放路径 (打开后是.class文件)
4.源代码的jar包(打开后是.java源文件)
---四部分的jar全部放到lib目录中 二 启动命令位置 把放在根目录(不一定是根目录)下的脚本文件.sh,.bat拷贝到bin目录中 三 配置文件位置 把src/main/resources目录下所有的文件拷贝到conf目录中 四 对于工程运行的jar包 将jar包的路径添加到manifest中 ,同时排除一些.xml文件
配置1:此配置没有使用maven-assembly-plugin,把内容直接写在build中
<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 --> 打包后的jar包内部具体的图见下文图 <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> //将jar包的路径添加到manifest中,具体可见下图 <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>
运行mvn install后 生成的目录如下:可以看到,最终的配置都是在外面的目录,如果要部署的话,最好是三个目录在一个tar包里面(见后面的实战)
lib目录下生成两个jar,一个是源文件source.jar(.java),一个是编译后的运行jar文件(.java)
配置2.项目实战配置,使用maven-assembly-plugin
<build> <finalName>dupchk</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <!-- The configuration of the plugin --> <configuration> <!-- Configuration of the archiver --> <archive> <!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 --> <addMavenDescriptor>false</addMavenDescriptor> <!-- Manifest specific configuration --> <manifest> <!-- 是否要把第三方jar放到manifest的classpath中 --> <addClasspath>true</addClasspath> <!-- 生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/ --> <classpathPrefix>lib/</classpathPrefix> <!-- 应用的main class --> <mainClass>com.cmsz.itbrs.dupchk.main.App</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <!-- The configuration of the plugin --> <configuration> <!-- Specifies the configuration file of the assembly plugin --> <descriptors> <descriptor>src/main/assembly/package.xml</descriptor> //xml文件中配置了打包的相关配置 </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
package.xml以及脚本的具体位置
package.xml 具体的配置内容,和配置一是类似的。
<assembly> <id>bin</id> //此处是打包名称的设置,最后是最后会生成一个dupcheck-bin.jar 文件在目录 target 下,其中前一个dupcheck来自finalName,后一个id来自assembly descriptor中的id(bin名称随便改) <!-- 最终打包成一个用于发布的zip文件 --> <formats> <format>tar</format> </formats> <!-- Adds dependencies to zip package under lib directory --> <dependencySets> <dependencySet> <!-- 不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录 --> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <unpack>false</unpack> </dependencySet> </dependencySets> <fileSets> <!-- 把项目的配置文件,打包进zip文件的config目录 --> <fileSet> <directory>${project.basedir}/src/main/resources</directory> <outputDirectory>config</outputDirectory> <includes> <include>*.properties</include> </includes> </fileSet> <!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 --> <fileSet> <directory>${project.basedir}/src/main/scripts</directory> <outputDirectory>bin</outputDirectory> <includes> <include>startup.*</include> </includes> </fileSet> </fileSets> </assembly>
打包后打开生成的tar包(dupcheck-bin.tar),可以看到以上配置的一个具体目录。
点开lib里面我们运行程序的jar包,在打开manifest.MF文件,可以看到文件里面已经将所有依赖的jar的路径写入了classpath路径