Java工程中可執(zhí)行JAR兩種打包方式詳解
一、需求概述
普通Java工程 docker-show 實現(xiàn)了定時打印docker應(yīng)用信息,現(xiàn)在需要將其打包成可執(zhí)行Jar部署到服務(wù)器端運行。
打包方式分為2種:
- 一體化可執(zhí)行包
- 帶外部依賴lib的可執(zhí)行包
二、代碼結(jié)構(gòu)

三、運行結(jié)果
此項目使用了線程池定時打印docker應(yīng)用名,端口信息


四、打包設(shè)置
1. 一體化可執(zhí)行包
pom文件中引入 maven-assembly-plugin插件,核心配置
<!-- 方式一:帶dependencies運行包 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.5.0</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <archive> <manifest> <mainClass>com.fly.simple.MainRun</mainClass> </manifest> </archive> <descriptorRefs> <!--將所有外部依賴JAR都加入生成的JAR包--> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution><!-- 配置執(zhí)行器 --> <id>make-assembly</id> <phase>package</phase><!-- 綁定到package階段 --> <goals> <goal>single</goal><!-- 只運行一次 --> </goals> </execution> </executions> </plugin>
2. 帶外部依賴lib的可執(zhí)行包
pom文件中引入 maven-dependency-plugin、maven-jar-plugin插件,核心配置
<!-- 方式二:外部依賴lib目錄運行包 -->
<!-- 將項目依賴包復制到<outputDirectory>指定的目錄下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeArtifactIds>lombok</excludeArtifactIds>
<includeScope>runtime</includeScope>
<!-- 默認為test,包含所有依賴 -->
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>com.fly.simple.MainRun</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
五、打包運行
1. 源碼放送
https://gitcode.com/00fly/demo
git clone https://gitcode.com/00fly/demo.git
或者使用下面的備份文件恢復成原始的項目代碼
如何恢復,請移步查閱:神奇代碼恢復工具
//goto pom-deps.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.fly</groupId>
<artifactId>docker-show</artifactId>
<version>0.0.1</version>
<name>java-depend</name>
<url>http://maven.apache.org</url>
<packaging>jar</packaging>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 方式一:帶dependencies運行包 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>com.fly.simple.MainRun</mainClass>
</manifest>
</archive>
<descriptorRefs>
<!--將所有外部依賴JAR都加入生成的JAR包-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution><!-- 配置執(zhí)行器 -->
<id>make-assembly</id>
<phase>package</phase><!-- 綁定到package階段 -->
<goals>
<goal>single</goal><!-- 只運行一次 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
//goto pom-lib.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.fly</groupId>
<artifactId>docker-show</artifactId>
<version>0.0.1</version>
<name>java-depend</name>
<url>http://maven.apache.org</url>
<packaging>jar</packaging>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 方式二:外部依賴lib目錄運行包 -->
<!-- 將項目依賴包復制到<outputDirectory>指定的目錄下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeArtifactIds>lombok</excludeArtifactIds>
<includeScope>runtime</includeScope>
<!-- 默認為test,包含所有依賴 -->
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>com.fly.simple.MainRun</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
//goto 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.fly</groupId>
<artifactId>docker-show</artifactId>
<version>0.0.1</version>
<name>java-depend</name>
<url>http://maven.apache.org</url>
<packaging>jar</packaging>
<properties>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 方式一:帶dependencies運行包 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<appendAssemblyId>true</appendAssemblyId>
<archive>
<manifest>
<mainClass>com.fly.simple.MainRun</mainClass>
</manifest>
</archive>
<descriptorRefs>
<!--將所有外部依賴JAR都加入生成的JAR包-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution><!-- 配置執(zhí)行器 -->
<id>make-assembly</id>
<phase>package</phase><!-- 綁定到package階段 -->
<goals>
<goal>single</goal><!-- 只運行一次 -->
</goals>
</execution>
</executions>
</plugin>
<!-- 方式二:外部依賴lib目錄運行包 -->
<!-- 將項目依賴包復制到<outputDirectory>指定的目錄下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeArtifactIds>lombok</excludeArtifactIds>
<includeScope>runtime</includeScope>
<!-- 默認為test,包含所有依賴 -->
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
<mainClass>com.fly.simple.MainRun</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>//goto src\main\java\com\fly\simple\Executor.java
package com.fly.simple;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Executor
{
private static String DOCKER_PS_CMD = "docker ps --format \"{{.Names}} {{.Ports}}\"";
/**
* execute命令
*
* @param command
* @throws IOException
* @see [類、類#方法、類#成員]
*/
public static List<String> execute(String command)
throws IOException
{
List<String> resultList = new ArrayList<>();
String[] cmd = SystemUtils.IS_OS_WINDOWS ? new String[] {"cmd", "/c", command} : new String[] {"/bin/sh", "-c", command};
Process ps = Runtime.getRuntime().exec(cmd);
try (InputStream in = ps.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)))
{
String line;
while ((line = br.readLine()) != null)
{
resultList.add(line);
}
}
return resultList;
}
/**
* 獲取docker相關(guān)信息
*
* @throws IOException
*/
@Deprecated
public static void printPorts1()
throws IOException
{
Map<String, Set<String>> map = new TreeMap<>();
for (String line : execute(DOCKER_PS_CMD))
{
log.info("{}", line);
String name = StringUtils.substringBefore(line, " ");
Set<String> ports =
Stream.of(StringUtils.substringAfter(line, " ").split(",")).map(p -> StringUtils.substringBetween(p, ":", "->")).filter(StringUtils::isNotBlank).map(p -> p.replace(":", "")).sorted().collect(Collectors.toSet());
map.put(name, ports);
}
log.info("######## {}", map);
}
/**
* 獲取docker相關(guān)信息
*
* @throws IOException
*/
public static void printPorts()
throws IOException
{
Map<String, Set<String>> map = new TreeMap<>();
execute(DOCKER_PS_CMD).stream()
.map(line -> Collections.singletonMap(StringUtils.substringBefore(line, " "),
Stream.of(StringUtils.substringAfter(line, " ").split(",")).map(p -> StringUtils.substringBetween(p, ":", "->")).filter(StringUtils::isNotBlank).map(p -> p.replace(":", "")).sorted().collect(Collectors.toSet())))
.forEach(it -> map.putAll(it));
log.info("######## {}", map);
}
}
//goto src\main\java\com\fly\simple\MainRun.java
package com.fly.simple;
import java.io.IOException;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MainRun
{
/**
* 線程池保證程序一直運行
*
* @param args
*/
public static void main(String[] args)
{
ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);
service.scheduleAtFixedRate(() -> {
try
{
Executor.printPorts();
}
catch (IOException e)
{
e.printStackTrace();
}
}, 2, 10, TimeUnit.SECONDS);
}
}//goto src\main\resources\log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="off" monitorInterval="0">
<appenders>
<console name="Console" target="system_out">
<patternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</console>
</appenders>
<loggers>
<root level="INFO">
<appender-ref ref="Console" />
</root>
</loggers>
</configuration>2. 打包執(zhí)行
#完整打包 mvn clean package #一體化可執(zhí)行包 mvn clean package -f pom-deps.xml #帶外部依賴lib的可執(zhí)行包 mvn clean package -f pom-lib.xml
3. 打包結(jié)果

到此這篇關(guān)于Java工程中可執(zhí)行JAR兩種打包方式詳解的文章就介紹到這了,更多相關(guān)Java打包可執(zhí)行JAR內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別
BigDecimal類有多個方法可以將其轉(zhuǎn)換為字符串,其中包括toString()和toPlainString(),本文主要介紹了Java中Bigdecimal類的toString()方法和toPlainString()方法區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-07-07
Java開發(fā)環(huán)境配置及Vscode搭建過程
今天通過圖文并茂的形式給大家介紹Java開發(fā)環(huán)境配置及Vscode搭建過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系
這篇文章主要介紹了關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系,WeakHashMap從名字可以得知主要和Map有關(guān),不過還有一個Weak,我們就更能自然而然的想到這里面還牽扯到一種弱引用結(jié)構(gòu),因此想要徹底搞懂,我們還需要知道四種引用,需要的朋友可以參考下2023-09-09
Java阻塞隊列BlockingQueue基礎(chǔ)與使用
本文詳細介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實例代碼介紹了Java 阻塞隊列BlockingQueue的相關(guān)知識,需要的朋友可以參考下2023-01-01
詳細說明關(guān)于Java的數(shù)據(jù)庫連接(JDBC)
這篇文章主要介紹了詳細說明關(guān)于Java的數(shù)據(jù)庫連接JDBC,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句,需要的朋友可以參考下面文章內(nèi)容2021-09-09

