參考博客: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路徑




