Maven –创建一个胖Jar文件– One-JAR示例

Java罐与Maven的

在本教程中,我们将向您展示如何使用Maven构建工具(One-JAR插件)将单个Jar及其依赖的Jar创建到单个可执行Jar文件中,即胖jar。

使用的工具 :

  1. Maven 3.1.1
  2. JDK 1.7
  3. 乔达时代2.5

1.创建一个简单的Java项目

从Maven快速入门模板创建Java项目。

$ mvn archetype:generate -DgroupId=com.mkyong.core.utils -DartifactId=dateUtils 
 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

将创建以下文件和文件夹结构。

.
|____dateUtils
| |____pom.xml
| |____src
| | |____main
| | | |____java
| | | | |____com
| | | | | |____mkyong
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____App.java
| | |____test
| | | |____java
| | | | |____com
| | | | | |____mkyong
| | | | | | |____core
| | | | | | | |____utils
| | | | | | | | |____AppTest.java

使它支持Eclipse。

$ mvn eclipse:eclipse

将项目导入Eclipse IDE。

一罐文件夹结构

2.更新Pom.xml

更新pom.xml以声明jodatime依赖项。 为了输出为Jar格式,请确保包装标签设置为“ jar”。 阅读注释以进行自我解释。

pom.xml
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mkyong.core.utils</groupId>
	<artifactId>dateUtils</artifactId>
	
	<packaging>jar</packaging>
	
	<version>1.0-SNAPSHOT</version>
	<name>dateUtils</name>
	<url>http://maven.apache.org</url>

	<properties>
		<jdk.version>1.7</jdk.version>
		<jodatime.version>2.5</jodatime.version>
		<junit.version>4.11</junit.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>${jodatime.version}</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>dateutils</finalName>
		<plugins>

		  <!-- download source code in Eclipse, best practice -->
		  <plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-eclipse-plugin</artifactId>
			<version>2.9</version>
			<configuration>
				<downloadSources>true</downloadSources>
				<downloadJavadocs>false</downloadJavadocs>
			</configuration>
		  </plugin>
			
		  <!-- Set a compiler level -->
		  <plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>2.3.2</version>
			<configuration>
				<source>${jdk.version}</source>
				<target>${jdk.version}</target>
			</configuration>
		  </plugin>

		  <!-- Make this jar executable -->
		  <plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<configuration>
			   <archive>
			     <manifest>
				<mainClass>com.mkyong.core.utils.App</mainClass>
			     </manifest>
			   </archive>
			</configuration>
		  </plugin>
						
		</plugins>
	</build>
	
</project>

3.使用JodaTime获取CurrentDate

使用以下内容更新生成的App.java

App.java
package com.mkyong.core.utils;

import org.joda.time.LocalDate;

public class App {

	public static void main(String[] args) {

		System.out.println(getLocalCurrentDate());
	}

	//Print current date with JodaTime
	private static String getLocalCurrentDate() {
		
		LocalDate date = new LocalDate();
		return date.toString();
		
	}

}

4. Jar文件

Maven将项目打包以生成最终的Jar文件。 在$project/target文件夹中创建一个新的dateutils.jar

$ mvn package

列出罐子内容。

$ jar tf target/dateutils.jar 

META-INF/
META-INF/MANIFEST.MF
com/
com/mkyong/
com/mkyong/core/
com/mkyong/core/utils/
com/mkyong/core/utils/App.class
META-INF/maven/
META-INF/maven/com.mkyong.core.utils/
META-INF/maven/com.mkyong.core.utils/dateUtils/
META-INF/maven/com.mkyong.core.utils/dateUtils/pom.xml
META-INF/maven/com.mkyong.core.utils/dateUtils/pom.properties

尝试运行此Jar文件。

$ java -jar dateutils.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/LocalDate
	at com.mkyong.core.utils.App.getLocalCurrentDate(App.java:14)
	at com.mkyong.core.utils.App.main(App.java:9)
Caused by: java.lang.ClassNotFoundException: org.joda.time.LocalDate
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	... 2 more

上面是预期的错误消息,因为缺少joda-time.jar

5.一罐的例子

更新pom.xml以使用One-Jar插件,它将创建一个Jar及其依赖的Jar。

pom.xml
<project>

  <build>
     <plugins>

	<!-- Includes the runtime dependencies -->
	<plugin>
		<groupId>org.dstovall</groupId>
		<artifactId>onejar-maven-plugin</artifactId>
		<version>1.4.4</version>
		<executions>
		  <execution>
			<goals>
				<goal>one-jar</goal>
			</goals>
		  </execution>
		</executions>
	</plugin>

	</plugins>
  </build>

  <!-- One-Jar is in the googlecode repository -->
  <pluginRepositories>
	<pluginRepository>
		<id>onejar-maven-plugin.googlecode.com</id>
		<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
	</pluginRepository>
  </pluginRepositories>
	
</project>

再次打包,将在“目标”文件夹中创建两个jar – dateUtils.jardateUtils-one-jar.jar

$ mvn package

dateUtils-one-jar.jar是您想要的最终胖罐,列出罐的内容:

$ jar tf target/dateutils.one-jar.jar 

META-INF/MANIFEST.MF

main/dateutils.jar
lib/joda-time-2.5.jar

com/
com/simontuffs/
com/simontuffs/onejar/
.version
OneJar.class
com/simontuffs/onejar/Boot$1.class
com/simontuffs/onejar/Boot$2.class
com/simontuffs/onejar/Boot$3.class
com/simontuffs/onejar/Boot.class
com/simontuffs/onejar/Handler$1.class
com/simontuffs/onejar/Handler.class
com/simontuffs/onejar/IProperties.class
com/simontuffs/onejar/JarClassLoader$1.class
com/simontuffs/onejar/JarClassLoader$2.class
com/simontuffs/onejar/JarClassLoader$ByteCode.class
com/simontuffs/onejar/JarClassLoader$FileURLFactory$1.class
com/simontuffs/onejar/JarClassLoader$FileURLFactory.class
com/simontuffs/onejar/JarClassLoader$IURLFactory.class
com/simontuffs/onejar/JarClassLoader$OneJarURLFactory.class
com/simontuffs/onejar/JarClassLoader.class
com/simontuffs/onejar/OneJarFile$1.class
com/simontuffs/onejar/OneJarFile$2.class
com/simontuffs/onejar/OneJarFile.class
com/simontuffs/onejar/OneJarURLConnection.class
src/
src/com/
src/com/simontuffs/
src/com/simontuffs/onejar/
src/OneJar.java
src/com/simontuffs/onejar/Boot.java
src/com/simontuffs/onejar/Handler.java
src/com/simontuffs/onejar/IProperties.java
src/com/simontuffs/onejar/JarClassLoader.java
src/com/simontuffs/onejar/OneJarFile.java
src/com/simontuffs/onejar/OneJarURLConnection.java
doc/
doc/one-jar-license.txt

One-Jar插件将运行时依赖项放入lib文件夹(例如lib/joda-time-2.5.jar ,并将主jar放入main文件夹中(例如main/dateutils.jar 。 此外,它还会创建许多simontuffs类,以帮助正确加载包含的Jars。

尝试运行最终的胖子。

$ java -jar dateutils.one-jar.jar 

2014-10-18

做完了

下载源代码

下载– maven-one-jar-example.zip (6 KB)

参考文献

  1. onejar-maven-plugin官方页面
  2. 乔达时间
  3. 如何使用Maven创建一个jar文件

翻译自: https://mkyong.com/maven/maven-create-a-fat-jar-file-one-jar-example/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Unable to access jarfile maven_demo127-1.0-SNAPSHOT.jar"这个错误通常意味着Docker容器无法找到指定的jar文件。根据引用和引用中的描述,这个错误可能是因为Docker容器没有正确地复制jar文件或者指定的jar文件不存在。 对于这个问题,你可以尝试以下几个步骤来解决: 1. 确保你已经在项目中正确地构建了jar文件。你可以使用命令`mvn install`或`mvn package`来构建项目并生成jar文件。确保生成的jar文件的路径和名称正确。 2. 检查Dockerfile中的COPY命令。确保路径和文件名与你生成的jar文件相匹配。根据引用中的示例Dockerfile,你需要将jar文件复制到容器的/app.jar路径下。如果你的jar文件名称不同,需要相应地修改Dockerfile。 3. 如果你已经确认Dockerfile和jar文件的路径和名称都是正确的,那么可能是Docker镜像中缺少了必要的Java运行时环境。你可以尝试更换一个包含Java运行时环境的基础镜像,比如openjdk:11-jdk-slim。 4. 如果以上步骤都没有解决问题,你可以尝试使用`docker logs`命令查看Docker容器的日志,以了解更多关于错误的详细信息。根据引用中的描述,可能会有其他错误信息,你可以根据这些信息来排查问题。 希望以上解答对你有帮助。如果问题还未解决,请提供更多详细信息,以便我们能够更好地帮助你解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [学习docker记录(二)](https://blog.csdn.net/ZRL1996/article/details/127561829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [容器化-Docker](https://blog.csdn.net/weixin_44318522/article/details/124711551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值