Maven打包可執行Jar的集中方法
一、無依賴其他任何jar
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.think.TestMain</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
執行:mvn clean package,在target中找到打包出來的,命令後執行java -jar xxx.jar即可,但是如果程式有依賴其他包,比如程式依賴jdbc去查詢db,這時候再執行就會出現找不到jdbc依賴,因為我們並沒有將依賴包打進去
二、解決依賴其他包時,可執行jar的打包
1、
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.think.TestMain</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
但以上方式用的比較少,因為我們依賴的jar,也會打進到我們最終生成的jar,這樣不太好,假如你生成的jar要給別人使用,最好給一個純淨的。
一般用assembly會再用他另外一個功能,將我們的jar歸檔,打包成一個zip
2、打成一個zip包,釋出專案的時候,將zip包copy到伺服器上,直接unzip xxx.zip,裡面包含要執行到jar以及依賴的lib,還有配置的config檔案,即可直接啟動服務
<build> <resources> <!-- 控制資原始檔的拷貝 --> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}/classes</targetPath> </resource> </resources> <plugins> <!-- 設定原始檔編碼方式 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- The configuration of maven-jar-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.think.TestMain</mainClass> </manifest> </archive> <!-- 過濾掉不希望包含在jar中的檔案 --> <!--<excludes>--> <!--<exclude>${project.basedir}/xml/*</exclude>--> <!--</excludes>--> </configuration> </plugin> <!-- The configuration of maven-assembly-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/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
還有一個重要的檔案,名字可以隨便起,我上面用的是 src/main/assembly/assembly.xml
<assembly>
<id>bin</id>
<includeBaseDirectory>false</includeBaseDirectory>
<!-- 最終打包成一個用於釋出的zip檔案 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用專案的artifact,第三方jar不要解壓,打包進zip檔案的lib目錄
-->
<useProjectArtifact>false</useProjectArtifact>
<!--<outputDirectory>lib</outputDirectory>-->
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把專案相關的說明檔案,打包進zip檔案的根目錄 -->
<!--<fileSet>-->
<!--<directory>${project.basedir}</directory>-->
<!--<outputDirectory>/</outputDirectory>-->
<!--</fileSet>-->
<!-- 把專案的配置檔案,打包進zip檔案的config目錄 -->
<fileSet>
<directory>${deploy.dir}/classes/</directory>
<outputDirectory>/conf</outputDirectory>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把專案自己編譯出來的jar檔案,打包進zip檔案的根目錄 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
最終執行命令:mvn clean package,出來的是這樣的
解壓zip包,我們看到我們想要的,good
3、還有一種打包方式,上面相當於把我們想要的東西打成一個zip包,全部放到一起,看著整潔好看,但有點繁瑣,我們其實可以用另外一個外掛來完成,不打包,即看到上圖解壓後的檔案
<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.test</groupId>
<artifactId>myTestJar</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myTestJar</name>
<url>http://maven.apache.org</url>
<properties>
<deploy.dir>./target/</deploy.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
</dependencies>
<build>
<finalName>myTest</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<!-- 控制資原始檔的拷貝 -->
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}</targetPath>
</resource>
</resources>
<plugins>
<!-- 設定原始檔編碼方式 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包jar檔案時,配置manifest檔案,加入lib包的jar依賴 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.think.TestMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷貝依賴的jar包到lib目錄 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}是maven變數,內建的,表示target目錄,如果不寫,將在跟目錄下建立/lib -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- excludeTransitive:是否不包含間接依賴包,比如我們依賴A,但是A又依賴了B,我們是否也要把B打進去 預設不打-->
<excludeTransitive>true</excludeTransitive>
<!-- 複製的jar檔案去掉版本資訊 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<!-- 解決資原始檔的編碼問題 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包source檔案為jar檔案 -->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這裡採用的是maven-dependency-plugin外掛,進行資源的copy。
4、
<build>
<resources>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.think.TestMain</mainClass>
</transformer>
<!--<transformer-->
<!--implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">-->
<!--<resource>applicationContext.xml</resource>-->
<!--</transformer>-->
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>executable</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
這種方式打出來是柔和到一起,成為一個jar,
可以直接java -jar xxx.jar執行。
我們可以根據不同需要來打包,如果暴露給外面,可以採用第4種,如果是自己公司專案打包,建議2,3種,因為有時候只是改了個配置檔案,不需要打包,直接把配置檔案複製進去即可相關推薦
maven 打包可執行jar的方法
1.修改pom.xml增加如下內容 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin<
Maven打包可執行Jar的集中方法
一、無依賴其他任何jar <build> <plugins> <plugin> <groupId>org.apache.maven.plugins<
Maven打包可執行Jar的幾種方法
一、無依賴其他任何jar <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&
maven打包可執行jar包
version 打開 print cto tid directory tor group XML 創建一個文件夾haha,裏面包含三項 Haha.java Main.java pom.xml pom.xml <?xml version="1.0"
Spring Boot Maven 打包可執行Jar文件!
project inux dep font feed spring 必須 connect plain Maven pom.xml 必須包含 [plain] view plain copy <packaging>jar</
spring-boot maven打包可執行jar
一. pom.xml中加入依賴 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-p
Spring Boot Maven 打包可執行Jar檔案!
Maven pom.xml 必須包含<packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.sprin
spring boot maven打包可執行jar包
普通打包之後在程式目錄執行,或者編寫bat執行時會提示“沒有主清單屬性”,這是因為並沒有找到main()方法,需要我們指明告訴java程式 我bat中的程式碼 @echo off title mytitle java -jar ysl-ts-web-base-1.0-SNAPSHOT.jar pause
Maven 打包可執行jar
有點時候我們專案不是通過IDEA 嚮導生成的spring-boot專案檔案,我們直接打出的jar包,通過java -jar xxxx.jar命令執行,報出xxx.jar中沒有清單屬性錯誤,這個時候我們需要指定jar的main入口和在jar包的MANIFEST.M
利用MAVEN打包可執行jar包,包括依賴的第三方包
看下專案pom.xml的配置,首先要配置maven-jar-plugin,把自己的程式碼編譯打包成jar檔案,然後配置maven-assembly-plugin,把整個專案打包成一個釋出包。 Xml程式碼 收藏程式碼 <build> <pl
maven 打包可執行jar包
Maven可以使用mvn package指令對專案進行打包,如果使用Java -jar xxx.jar執行執行jar檔案,會出現"no main manifest attribute, in xxx.jar"(沒有設定Main-Class)、ClassNotFou
Maven打包可執行jar並且壓縮
1. pom.xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId>
maven打包可執行jar
這裡介紹一下maven打包成可執行jar包 1.依賴處理 mvn dependency:copy-dependencies -DoutputDirectory=target/lib eclipse下對著工程右鍵->run as-> maven build...
maven 打包可執行jar包的坑
寫作背景:首先是從20天的年假回來,新年的第一個任務是將使用者行為系統自動化。需要將Java專案打包成一個可執行的jar包,讓shell指令碼定時執行。 我一直習慣於用maven的maven install打包,在打包之前maven clean清理。於是,my
Maven打包可執行jar 分離配置檔案和lib
類: classloader 產生的resourceAsStream只能載入classpath下的配置檔案,如果想載入其他目錄的檔案需要使用file的形式,maven專案src/main/resources/對應classpath,這個路徑下的檔案不打包,所以不能使用r
聚合maven+spring-boot打包可執行jar
.so mave 一個 route source 兩種 惡心 兩種方法 color 整整搞了一天,終於解決這個問題了。這裏是四個module,module之間存在依賴,打包兩個可執行jar,看下最終效果吧 聚合maven+spring-boot的搭建很
maven外掛打包可執行jar包到docker
pom.xml檔案新增docker外掛 <build> <plugins> <!-- docker的maven外掛,官網:https://github.com/spotify/docker-maven-plugin --> &l
eclipse使用MAVEN打包可執行的jar包
1.新建maven工程 注意勾選 隨便填一下 建好之後工程目錄如下 新建測試類與工具類,主類很簡單 工具類也很簡單,就是初始化了日誌 maven依賴包也只有一個log4j的jar <dependencies> <dependency&
maven專案依賴本地jar包時編譯生成可執行jar包方法
maven專案需要本地jar包時,在根目錄新建lib目錄,將jar包拷貝到lib目錄並且新增到build path此時直接打可執行jar包會出現編譯報錯、啟動時缺少jar包等問題解決方案: 1.增加編譯外掛, 解決Failed to execute goal org.a
SpringBoot+Maven多模組專案(建立、依賴、打包可執行jar包部署測試)完整流程
開發環境:IDEA, SprngBoot 2.0.4, Maven 2.19.1 工程結構: 父工程father