java打包可运行的jar包

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

 

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


   org.apache.maven.plugins
   maven-jar-plugin
   2.6
   
      
         
            
            true
            
            lib/

            cn.qlt.service.UserService
         
      
   



   org.apache.maven.plugins
   maven-dependency-plugin
   
      
         copy
         
         compile
         
           copy-dependencies
         
         
            
            
             ${project.build.directory}/lib
            
         
      
   

 

运行: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插件

 


				org.apache.maven.plugins
				maven-assembly-plugin
				2.5.5
				
					
						
							cn.qlt.service.UserService
						
					
					
						
						jar-with-dependencies
					
				
				
					
						make-assembly
						package
						
							single
						
					
				
			
 

 

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

 

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

 
				org.apache.maven.plugins
				maven-assembly-plugin
				2.5.5
				
					
						make-assembly
						package
						
							single
						
						
						
						false
						
							
							assembly.xml
						
						
							
								cn.qlt.service.UserService
							
						
						
					
				
			  

 assembly.xml:


	distribution
	
	false
	
		
		jar
	
	
		
                        
			${project.build.outputDirectory}
			/
		
	
	
		
                       
			false
			 
                        false
                         
		         /lib
		
	

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

 

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

 


	org.apache.maven.plugins
	maven-shade-plugin
	2.4.1
	
		
			
				cn.qlt.service.UserService
			
		
	
	
		
                        
			package
			
				shade
			
		
	
 

 

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

 

说明:

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

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

 

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

maven:


		org.springframework.boot
		spring-boot-maven-plugin
		1.2.5.RELEASE
		
			
				
					repackage
				
				
					
					boot
					cn.qlt.service.UserService
				
			
		
 

 

 

运行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"
}

 

 

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

你可能感兴趣的:(java)