当前位置: 代码网 > it编程>编程语言>Java > Java工程中可执行JAR两种打包方式详解

Java工程中可执行JAR两种打包方式详解

2024年05月15日 Java 我要评论
一、需求概述普通java工程 docker-show 实现了定时打印docker应用信息,现在需要将其打包成可执行jar部署到服务器端运行。打包方式分为2种:一体化可执行包带外部依赖lib的可执行包二

一、需求概述

普通java工程 docker-show 实现了定时打印docker应用信息,现在需要将其打包成可执行jar部署到服务器端运行。

打包方式分为2种:

  • 一体化可执行包
  • 带外部依赖lib的可执行包

二、代码结构

三、运行结果

此项目使用了线程池定时打印docker应用名,端口信息

四、打包设置

1. 一体化可执行包

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><!-- 配置执行器 -->
						<id>make-assembly</id>
						<phase>package</phase><!-- 绑定到package阶段 -->
						<goals>
							<goal>single</goal><!-- 只运行一次 -->
						</goals>
					</execution>
				</executions>
			</plugin>

2. 带外部依赖lib的可执行包

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><!-- 配置执行器 -->
						<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><!-- 配置执行器 -->
						<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相关信息
     * 
     * @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相关信息
     * 
     * @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. 打包执行

#完整打包
mvn clean package

#一体化可执行包
mvn clean package -f pom-deps.xml

#带外部依赖lib的可执行包
mvn clean package -f pom-lib.xml

3. 打包结果

到此这篇关于java工程中可执行jar两种打包方式详解的文章就介绍到这了,更多相关java打包可执行jar内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com