將Java應用程序打包為一個(或胖)JAR

這篇文章的目標是一個有趣但非常強大的概念:將應用程序打包為單個可運行的JAR文件,也稱為一個 JAR文件。

我們習慣了大型WAR歸檔文件,其中包含所有打包在某些公用文件夾結構下的依賴項。 使用類似于JAR的打包,情況有所不同:為了使您的應用程序可運行(通過java -jar ),所有依賴項都應通過classpath參數或環境變量提供。 通常,這意味著將存在一些具有所有依賴項的lib文件夾和一些可運行的腳本 ,這些腳本將完成構造類路徑和運行JVM的工作。 Maven Assembly插件因進行這種應用程序分發而聞名。

稍微不同的方法是將所有應用程序依賴項打包到同一JAR文件中,并使其可運行,而無需任何其他參數或腳本。 聽起來不錯,但是……除非您添加一些魔力,否則它將無法正常工作:滿足One-JAR項目。

讓我們簡要概述一下問題:我們正在編寫一個獨立的Spring應用程序,只需鍵入java -jar <our-app.jar>即可運行該應用程序。

和往常一樣,讓我們??從我們的POM文件開始,這將非常簡單

<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.example</groupid><artifactid>spring-one-jar</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring-one-jar</name><url>http://maven.apache.org</url><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding><org.springframework.version>3.1.1.RELEASE</org.springframework.version></properties><dependencies><dependency><groupid>cglib</groupid><artifactid>cglib-nodep</artifactid><version>2.2</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${org.springframework.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${org.springframework.version}</version></dependency></dependencies>
</project>

我們的示例應用程序將引導Spring上下文,獲取一些bean實例并在其上調用一個方法。 我們的bean叫做SimpleBean ,看起來像:

package com.example;
public class SimpleBean {public void print() {System.out.println( 'Called from single JAR!' );}
}

愛上Spring Java配置,讓我們將上下文定義為帶注釋的AppConfig POJO:

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.example.SimpleBean;@Configuration
public class AppConfig {@Beanpublic SimpleBean simpleBean() {return new SimpleBean();}
}

最后,我們的應用程序Startermain()

package com.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.example.config.AppConfig;public class Starter {public static void main( final String[] args ) {ApplicationContext context = new AnnotationConfigApplicationContext( AppConfig.class );SimpleBean bean = context.getBean( SimpleBean.class );bean.print();}
}

將我們的主類添加到META-INF / MANIFEST.MF可以利用Java功能來運行JAR文件,而無需使用main()方法顯式指定類。 Maven JAR插件可以幫助我們。

<build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-jar-plugin</artifactid><configuration><archive><manifest><mainclass>com.example.Starter</mainclass></manifest></archive></configuration></plugin></plugins>
</build>

嘗試運行java -jar spring-one-jar-0.0.1-SNAPSHOT.jar會將異常輸出到控制臺: java.lang.NoClassDefFoundError 。 原因很簡單:即使是這樣一個簡單的應用程序,也已經要求以下庫位于類路徑中。

aopalliance-1.0.jar
cglib-nodep-2.2.jar
commons-logging-1.1.1.jar
spring-aop-3.1.1.RELEASE.jar
spring-asm-3.1.1.RELEASE.jar
spring-beans-3.1.1.RELEASE.jar
spring-context-3.1.1.RELEASE.jar
spring-core-3.1.1.RELEASE.jar
spring-expression-3.1.1.RELEASE.jar

讓我們在這里看看One-JAR可以為我們做些什么。 由于onejar-maven-plugin的可用性,我們可以在我們的POM文件的plugins部分中添加一個。

<plugin><groupid>org.dstovall</groupid><artifactid>onejar-maven-plugin</artifactid><version>1.4.4</version><executions><execution><configuration><onejarversion>0.97</onejarversion><classifier>onejar</classifier></configuration><goals><goal>one-jar</goal></goals></execution></executions>
</plugin>

另外, pluginRepositories部分應包含此存儲庫以便下載插件。

<pluginrepositories><pluginrepository><id>onejar-maven-plugin.googlecode.com</id><url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url></pluginrepository>
</pluginrepositories>

結果, 目標文件夾中將提供另一個工件,后綴有one-jarspring-one-jar-0.0.1-SNAPSHOT.one-jar.jar 。 使用java -jar spring-one-jar-0.0.1-SNAPSHOT.one-jar.jar運行此命令將打印到控制臺:

Called from single JAR!

完全可運行的Java應用程序,作為單個可再發行的JAR文件! 最后的評論:盡管我們的應用程序看起來很簡單,但是One-JAR也可以完美地用于復雜的大型應用程序。 請把它添加到您的工具箱中,它是非常有用的工具。

感謝One-JAR伙計們!

參考: 簡單但功能強大的概念:在Andriy Redko {devmind}博客上,從我們的JCG合作伙伴 Andrey Redko 將Java應用程序打包為一個(或胖)JAR 。

翻譯自: https://www.javacodegeeks.com/2012/11/packing-your-java-application-as-one-or-fat-jar.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習java的第三天,猜字符的小程序

關于猜字符的小程序 主要實現&#xff1a;隨機輸出5個字母&#xff0c;用戶輸入猜測的字母&#xff0c;進行對比得出結果 主要有3個方法&#xff1a;主方法main(); 產生隨機字符的方法generate(); 比較用戶輸入的字符與隨機產生的字符的方法check&#xff08;&#xff09;&…

《Linux命令行與shell腳本編程大全 第3版》創建實用的腳本---10

以下為閱讀《Linux命令行與shell腳本編程大全 第3版》的讀書筆記&#xff0c;為了方便記錄&#xff0c;特地與書的內容保持同步&#xff0c;特意做成一節一次隨筆&#xff0c;特記錄如下&#xff1a;轉載于:https://www.cnblogs.com/guochaoxxl/p/7894995.html

python安裝包找不到setup_如何安裝沒有setup.py的Python模塊?

在系統上開始使用該代碼的最簡單的方法是&#xff1a;>將文件放入機器上的目錄中,>將該目錄的路徑添加到您的PYTHONPATH步驟2可以從Python REPL完成如下&#xff1a;import syssys.path.append("/home/username/google_search")您的文件系統的外觀示例&#xf…

Spring Batch中面向TaskletStep的處理

許多企業應用程序需要批處理才能每天處理數十億筆交易。 必須處理這些大事務集&#xff0c;而不會出現性能問題。 Spring Batch是一個輕量級且強大的批處理框架&#xff0c;用于處理這些大數據集。 Spring Batch提供了“面向TaskletStep”和“面向塊”的處理風格。 在本文中&a…

布局中常見的居中問題

說到布局除了浮動以及定位外還有一個不得不提的點&#xff0c;那就是居中&#xff0c;居中問題我們在網頁布局當中經常遇到&#xff0c;那么以下就是分為兩部分來講&#xff0c;一部分是傳統的居中&#xff0c;另一種則是flex居中&#xff0c;每個部分又通過分為水平垂直居中來…

unity json解析IPA后續

以前說到的&#xff0c;有很大的限制&#xff0c;只能解析簡單的類&#xff0c;如果復雜的就會有問題&#xff0c;從老外哪里看到一片博客&#xff0c;是將類中的list 等復雜對象序列化&#xff0c; using UnityEngine; using System.Collections; using System.Collections.…

改善代碼質量之內連臨時變量

待增轉載于:https://www.cnblogs.com/muyl/articles/6940896.html

python 矩陣元素相加_Numpy中元素級運算

標量與矩陣的運算:加法&#xff1a;values [1,2,3,4,5]values np.array(values) 5#現在 values 是包含 [6,7,8,9,10] 的一個 ndarray乘法&#xff1a;x np.multiply(some_array, 5)x some_array * 5矩陣與矩陣的運算:加法&#xff1a;對應元素相加&#xff0c;但形狀必須相…

排序算法——桶排序

把數據放進若干個桶&#xff0c;然后在桶里用其他排序&#xff0c;近乎分治思想。從數值的低位到高位依次排序&#xff0c;有幾位就排序幾次。例如二位數就排兩次&#xff0c;三位數就排三次&#xff0c;依次按照個十百...的順序來排序。 第一次排序&#xff1a;50 12 …

原型設計模式:創建另一個小車

創建對象確實是一個耗時的過程&#xff0c;也是一件昂貴的事情。 因此&#xff0c;我們現在正努力節省時間和金錢。 我們該怎么做&#xff1f; 克隆奇跡多莉 有人記得多莉嗎&#xff1f; 是的&#xff0c;是綿羊&#xff0c;是第一個被克隆的哺乳動物。 好吧&#xff0c;我不想…

java實現周期任務_java定時任務的實現方式

本文列舉常見的java定時任務實現方式&#xff0c;并做一定比較。1. 循環內部sleep實現周期執行創建一個thread&#xff0c;run() while循環里sleep()來實現周期性執行; 簡單粗暴&#xff0c;作為一個初學者很容易想到。public class Task1 {public static void main(String[] a…

磁盤鏡像工具Guymager

磁盤鏡像工具Guymager在數字取證中&#xff0c;經常需要對磁盤制作鏡像&#xff0c;以便于后期分析。Kali Linux提供一款輕量級的磁盤鏡像工具Guymager。該工具采用圖形界面化方式&#xff0c;提供磁盤鏡像和磁盤克隆功能。它不僅生成dd的鏡像&#xff0c;還能生成EWF和AFF鏡像…

python怎么寫代碼求年華收益率_如何計算年化收益率?

關于投資年化收益率的計算&#xff0c;三思君覺得主要有三種&#xff0c;分別是一次性投資的收益率計算、定期定額的收益率計算、不定期不定額的收益率計算。1.一次性投資的收益率計算對于一次性投資的收益率&#xff0c;相信大家都會計算。比如&#xff0c;小李同學去年買了一…

HTTPS協議在Tomcat中啟用的配置

本文將講解HTTPS協議在Tomcat中啟用是如何配置的。 概念簡介 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。 HTTP 超文本…

CSS3實現煙花特效 --web前端

煙花特效&#xff0c;比較簡單&#xff0c;直接貼代碼了……<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>css3實現煙花特效</title> <style> * { margin: 0; padding: 0; } html{ widt…

虛擬機 java 開發_深入淺出 Java 虛擬機 · 通往高級 Java 開發的必經之路

第一章 JVM 內存模型Java 虛擬機(Java Virtual MachineJVM)的內存空間分為五個部分&#xff0c;分別是&#xff1a;程序計數器Java 虛擬機棧本地方法棧堆方法區。下面對這五個區域展開深入的介紹。1.1 程序計數器1.1.1 什么是程序計數器&#xff1f;程序計數器是一塊較小的內存…

java.lang.ClassNotFoundException:如何解決

本文適用于當前面臨java.lang.ClassNotFoundException挑戰的Java初學者。 它將為您提供此常見Java異常的概述&#xff0c;這是一個示例Java程序&#xff0c;可支持您的學習過程和解決策略。 如果您對與更高級的類加載器相關的問題感興趣&#xff0c;我建議您復習有關java.lang…

iOS10 App跳轉到系統設置

實現類似萬能鑰匙中點擊一個Wi-Fi跳轉到系統Wi-Fi設置界面的功能。 NSString * urlString "App-Prefs:rootWIFI";if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {if ([[UIDevice currentDevice].systemVersion doubleValue…

python生成器 圖片分類_python批量處理圖片圖片Python迭代器和生成器介紹

Python迭代器和生成器介紹迭代器迭代器是一個實現了迭代器協議的對象&#xff0c;Python中的迭代器協議就是有next方法的對象會前進到下一結果&#xff0c;而在一系列結果的末尾是&#xff0c;則會引發StopIteration。在for循環中&#xff0c;Python將自動調用工廠函數iter()獲…

Java-IO流之BufferedReader 和BufferedWriter的使用和原理

BufferedReader和BufferedWriter出現的目的是為了對FileReader以及FileWriter的讀寫操作進行增強&#xff0c;而怎么增強呢&#xff0c;原理類似于使用StringBuilder&#xff0c;是把數據先放入他們的一個char數組中&#xff0c;然后再操作char數組。 使用緩沖區的字符流是使用…