`
z19910509
  • 浏览: 50435 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java打包可运行的jar包

    博客分类:
  • java
阅读更多

整理了下各种打包可执行jar的方法,个人而言,觉得使用spring-boot插件更方便,且生成的jar包也更精简,推荐使用

 

方法一:使用maven-jar-plugin插件

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <version>2.6</version>
   <configuration>
      <archive>
         <manifest>
            <!--将依赖的jar添加到classpath,具体效果查看生成jar里的META-INF/MANIFEST.MF的Class-Path-->
            <addClasspath>true</addClasspath>
            <!--classpath路径前缀,如lib/log4j.jar-->
            <classpathPrefix>lib/</classpathPrefix>
<!--程序入口类-->
            <mainClass>cn.qlt.service.UserService</mainClass>
         </manifest>
      </archive>
   </configuration>
</plugin>
<!--该插件用于将依赖jar复制到指定文件夹-->
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <executions>
      <execution>
         <id>copy</id>
         <!--将该操作绑定在compile周期中-->
         <phase>compile</phase>
         <goals>
           <goal>copy-dependencies</goal>
         </goals>
         <configuration>
            <outputDirectory>
            <!--复制的ar包存放的目录,以下路径即target/lib-->
             ${project.build.directory}/lib
            </outputDirectory>
         </configuration>
      </execution>
   </executions>
</plugin>

 

运行:mvn clean package

会在target目录下生成一个可执行的jar包与存放依赖的lib文件夹,将生成的jar包与lib文件夹放入同一目录下,执行 java -jar XXX.jar即可

说明:

1、依赖的jar包与程序不能打入一个jar包,这样最终部署的时候还得程序jar与依赖的jar包同时部署,比较麻烦

2、通过设置outputDirectory:${project.build.directory}/classes/lib也做到了将依赖与程序打入一个jar,但最终运行总是找不到依赖的jar。尝试了许多次均宣告失败。若有知道用该插件将依赖与程序打为一个jar的相关配置,烦劳告知,谢谢

 

方法二:使用maven-assembly-plugin插件

 

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.5.5</version>
				<configuration>
					<archive>
						<manifest>
							<mainClass>cn.qlt.service.UserService</mainClass>
						</manifest>
					</archive>
					<descriptorRefs>
						<!--引用id为jar-with-dependencies的一个descriptor文件,该文件为该插件预先写好的文件。在.m2\repository\org\apache\maven\plugins\maven-assembly-plugin\2.5.5文件夹,解压maven-assembly-plugin-2.5.5.jar,在assemblies文件夹里可查看该文件-->
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
 

 

 
 说明:通过上述方法即可生成可执行的jar包,但其将依赖的jar包都解压了,即我们看到的都是一个个文件夹与class文件,这样从管理等方面都不是很友好。

 

上面说过jar-with-dependencies其实是一个id为jar-with-dependencies的xml文件,下面就是我们自定义这种xml文件的方法。

 <plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.5.5</version>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
						<configuration>
						<!--若为true,则在生成的jar名称后面追加assembly.xml文件中我们定义的id-->
						<appendAssemblyId>false</appendAssemblyId>
						<descriptors>
							<!--自定义的xml文件-->
							<descriptor>assembly.xml</descriptor>
						</descriptors>
						<archive>
							<manifest>
								<mainClass>cn.qlt.service.UserService</mainClass>
							</manifest>
						</archive>
						</configuration>
					</execution>
				</executions>
			</plugin>  

 assembly.xml:

<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
	<id>distribution</id>
	<!-- 如果为true,会将文件打入以项目ArtifactId为名的文件夹内-->
	<includeBaseDirectory>false</includeBaseDirectory>
	<formats>
		<!--打包类型-->
		<format>jar</format>
	</formats>
	<fileSets>
		<fileSet>
                        <!--将指定目录中文件打包到下面定义目录,这里为classes目录-->
			<directory>${project.build.outputDirectory}</directory>
			<outputDirectory>/</outputDirectory>
		</fileSet>
	</fileSets>
	<dependencySets>
		<dependencySet>
                       <!--若为true,则将依赖解压,即我们看到的是文件夹和class文件 -->
			<unpack>false</unpack>
			<!--是否将当前项目的非执行jar包打入依赖--> 
                        <useProjectArtifact>false</useProjectArtifact>
                         <!--依赖的输出地址-->
		         <outputDirectory>/lib</outputDirectory>
		</dependencySet>
	</dependencySets>
</assembly>

 通过这种方式,我们将依赖与我们的程序都打入一个jar包了,但java -jar运行程序的时候,依赖的类都是notfound,是不是因为没有添加到classpath,不知道怎么解决。在MANIFEST.MF中配置Class-Path只能配置当前jar包外面的路径,因依赖jar已打入jar包,不知如何配置

 

方法三:使用maven-shade-plugin插件

 

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>2.4.1</version>
	<configuration>
		<transformers>
			<transformer        
				implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--设置入口类-->				<mainClass>cn.qlt.service.UserService</mainClass>
			</transformer>
		</transformers>
	</configuration>
	<executions>
		<execution>
                        <!--绑定在maven的package生命周期上-->
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
		</execution>
	</executions>
</plugin> 

 

运行:mvn clean package,会在target目录里生成xxx-shaded.jar,运行该jar即可

 

说明:

1、和上面maven-assembly-plugin插件一样通过该方法生成的可运行jar文件,将我们依赖的jar包都解压了,即我们看到的是一个个的文件夹与class,这对于我们的管理十分的不方便

2、如果想去掉生成的jar文件名的后缀shaded或者改一个名字,在<configuration></configuration>中增加<shadedArtifactAttached>false</shadedArtifactAttached>或<shadedClassifierName>自定义的ClassifierName</shadedClassifierName>即可

 

方法四:使用spring-boot插件(建议)

maven:

<plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
		<version>1.2.5.RELEASE</version>
		<executions>
			<execution>
				<goals>
					<goal>repackage</goal>
				</goals>
				<configuration>
					<!--非必填项,即在生成的jar包名称后面追加该分类名称-->
					<classifier>boot</classifier>
					<mainClass>cn.qlt.service.UserService</mainClass>
				</configuration>
			</execution>
		</executions>
</plugin> 

 

 

运行mvn clean package即可。该方法将依赖与我们自己的程序打入同意jar包。且依赖jar没有解压放入lib文件夹下。通过jar -jar运行没有出现依赖找不到的情况。

 

说明:

若出现以下异常:[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.2.5.RELEASE:repackage (default) on project maven-service: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.2.5.RELEASE:repackage failed: For artifact {cn.qlt:maven-service:0.0.1-SNAPSHOT:jar}: An attached artifact must have a different ID than its corresponding main artifact

 

请检查是否在spring-boot-maven-plugin插件中配置了finalname,若配置了该属性,请同时配置classifier。因为若不配置classifier且又设置了finalname导致了同一group和artifact中出现了两个jar包(我们生成的可执行的jar和普通的jar),这样maven就不知道用哪个了

 

gradle:

buildscript {
    //引入spring-boot-gradle插件
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC1")
    }
}
//使用spring-boot插件
apply plugin: 'spring-boot'

springBoot {
        //配置入口类
    	mainClass = "main.Zone"
}

 

 

以上就是整理的打包可执行程序方法。若哪位兄弟知道其他更好的方法或者有好的建议,劳烦提出,谢谢

分享到:
评论
1 楼 luorixin2009 2016-03-18  
问问去

相关推荐

    jarjar-方便Java打包工具,自定义修改jar包包名

    标题提到的"jarjar-方便Java打包工具,自定义修改jar包包名",这表明jarjar允许开发者对JAR内的类进行重命名,并且可以改变JAR本身的文件名。这种灵活性对于项目维护、依赖管理或解决类冲突问题非常有帮助。例如,你...

    java打包为jar

    在Java开发过程中,将项目打包成可执行的JAR(Java Archive)文件是常见的操作,这使得代码可以方便地分发、部署和运行。本文将详细介绍如何将Java工程打包成可执行的JAR文件。 首先,确保你有一个完整的Java工程,...

    java 程序打包成jar文件后 连接数据库出错(教程方法)

    在Java编程中,将程序打包成JAR文件是常见的部署方式,这使得代码可以作为一个独立的可执行单元进行分发。然而,在打包包含数据库连接的Java应用程序时,可能会遇到一些问题,尤其是涉及到像MySQL这样的外部数据库。...

    java打包成jar

    根据提供的信息,本文将详细介绍如何通过不同方式将Java程序打包成可执行的JAR文件。 #### 使用`jar`命令手动打包 1. **准备工作**:首先确保所有的`.class`文件位于同一个目录下,例如`D:/chat/`。 2. **创建...

    java打包jar方案的优缺点分析及解决方案

    Java打包成JAR文件是将源代码编译后的字节码和相关资源组合在一起的常见方式,便于分发和执行。以下是对三种不同打包方法的详细分析和比较: 1. **使用Eclipse插件fat.jar打包** `fat.jar`插件允许开发者将所有...

    在eclipse中把java文档打包成jar文件

    Java程序员在开发过程中经常会遇到这样一个问题:如何将编写好的Java程序打包成一个可执行的Jar文件?在Eclipse中,我们可以通过简单的步骤将Java程序打包成Jar文件,本文将详细介绍这其中的实现步骤和重要的知识点...

    Java项目后台打包jar包执行报错“没有主清单属性”

    在Java开发过程中,将项目打包成可执行的jar文件是一项常见的任务,这使得代码可以方便地在不同环境中部署和运行。然而,有时在打包过程中可能会遇到一些错误,比如"没有主清单属性"。这个错误表明jar文件缺少了必要...

    生成JAR包的方法(打包后运行好像不快)

    - **使用原生打包工具**:例如使用`Native-image`等工具,可以将JAR包转换为原生可执行文件,通常可以显著提升启动速度。 - **清单文件优化**:在清单文件中合理设置`Main-Class`和`Class-Path`等属性,避免不必要...

    Java打包成可执行文件步骤详解

    ### Java打包成可执行文件步骤详解 在Java开发过程中,将编写好的程序打包成一个可执行文件是非常常见的需求。这不仅方便程序的分发与部署,还能提高程序的可用性。本文将通过一个具体的示例来详细介绍如何将Java...

    java打包机,可将jar打包为可执行的exe

    Java打包机是一款便捷的工具,专门用于将Java的.jar文件转换为可执行的.exe文件,使得非Java环境的用户也能方便地运行Java程序。这款工具相比exe4j来说,操作更为简便,对于开发者来说,是一个快速发布Java应用程序...

    java 打包 classes 为 jar

    标题“Java 打包 Classes 为 Jar”涉及的是Java开发中的一个重要步骤,即将编译后的类文件打包成一个可执行的JAR(Java Archive)文件。这个过程对于部署和分发Java应用程序至关重要。下面我们将详细探讨这个主题。 ...

    linux下javaSwing开发的jar包CS打包完整步骤.docx

    **第二步:创建可执行jar包** 首先,在Eclipse等IDE中导出Java项目为可执行jar文件。确保所有依赖项都被包含在jar中,或者一起打包在一个文件夹内,该文件夹应以`name-version`的格式命名,例如`szbb-1.0.1`,以避免...

    Java打包成jar文件,以及将jar文件导出为exe文件方法汇总[汇编].pdf

    然而,在将 Java 项目打包成可执行文件时,需要使用特殊的工具和技术。下面将介绍两种方法来实现 Java 打包成 jar 文件和将 jar 文件导出为 exe 文件。 方法一:使用 Eclipse 导出 jar 文件 使用 Eclipse 可以快速...

    java集成kettle所有jar包

    6. **打包和部署**:将Java应用打包成可执行的JAR或WAR文件,然后部署到目标环境,如本地服务器、云平台等。 最后,记住Kettle的版本更新可能带来API的变化,因此保持你的Kettle版本与Java项目同步是很重要的。定期...

    idea将Java项目打包Jar包生成exe应用程序.docx

    在IT行业中,将Java项目打包成可执行的jar或exe文件是常见的需求,特别是对于希望在没有Java环境的用户机器上运行的应用程序。本篇主要介绍如何使用IntelliJ IDEA(Idea)将Springboot或Java项目打包为jar,并通过...

    java配置数据库jar包操作

    Java 配置数据库 Jar 包操作 Java 配置数据库 Jar 包操作是指在 Java 项目中将 MySQL 数据库的 Jar 包导入到项目中,以便使用 JDBC 连接数据库的操作。下面是关于 Java 配置数据库 Jar 包操作的详细知识点: 什么...

    java 桌面程序打包jar可执行包,类似达成exe可执行程序

    标题提到的"java 桌面程序打包jar可执行包,类似达成exe可执行程序",指的是通过特定工具或方法,让Java程序像Windows平台上的.exe文件一样,双击即可运行。 Eclipse是一款广泛使用的Java集成开发环境(IDE),它...

    java打包jar文件实例

    Java打包JAR(Java Archive)文件是将多个类文件、资源文件和其他相关文件组合到一个单一的可执行文件中,以便于分发和执行。在Java开发中,JAR文件通常用于封装库、应用程序或者Java小应用程序(Applet)。本实例将...

    编译运行java带jar包

    在Java编程环境中,有时...总结来说,编译和运行带有JAR包的Java程序涉及编译源代码、设置类路径、创建MANIFEST.MF文件指定主类、打包成JAR并最后运行JAR。通过使用IDE或构建工具,这个过程可以变得更加便捷和高效。

    将java文件打包成 jar jar命令详解

    JAR(Java Archive)是 Java 开发工具包 (JDK) 中的一个实用程序,用于将多个 Java 类文件和其他资源文件打包成一个 JAR 文件。JAR 文件不仅便于分发和部署,还支持对文件进行压缩,减少文件大小。 #### 二、JAR ...

Global site tag (gtag.js) - Google Analytics