一罐來統治所有人

跳下內存通道

早在1998年,當我是一名C / C ++開發人員時,嘗試使用Java時,有關該語言的一些內容對我來說就顯得有些惱火了。 我記得很擔心這些

  1. 為什么沒有合適的編輯器呢? C / C ++有很多。 我為Java擁有的只是舊的記事本。
  2. 當我想要的只是一個函數時,為什么我必須上一堂課? 為什么函數也不是對象?
  3. 為什么我不能將所有內容打包到一個zip / jar中,然后讓最終用戶雙擊啟動?

和其他一些。 那時,我發現自己經常因為無法放棄自己的“ C / C ++思維方式”和擁抱“ Java方式”而自欺欺人。 現在,大約在十年半后的2013年寫這篇文章,令人驚訝的是,所有這些早期的煩惱都消失了。 不是因為我采用了“ Java”方式,而是因為Java發生了變化。

除了閑聊之外,本文的重點是討論以下問題之一:“為什么我不能將所有內容打包到一個zip / jar中,讓最終用戶雙擊啟動?”。

為什么我們需要一個可執行的zip / jar文件?

如果您是開發人員,請在您的IDE上愉快地編碼(我鄙視所有從Eclipse開始使用Java編碼,NetBeans從一開始就不必在記事本上編碼的人),并在Google的幫助下(我非常討厭所有人) (他們不必在Google之前就可以在互聯網上找到東西),可能沒有令人信服的案例。

但是,當您遇到一種情況時

  1. 您之所以進入數據中心,是因為那里的人遵循了您的部署步驟,但是您的應用程序/網站根本無法正常工作?
  2. 突然之間,當“根本沒有人碰到”生產箱時,環境變量全部搞砸了,而您就是必須“使其正常工作”的人。
  3. 您正與業務利益相關者坐在一起,難以置信地盯著“ ClassNotFound例外”,并確信Java根本不喜歡您。

簡而言之,我想說的是,當您處于開發箱/環境的“相對”理智狀態時,一個可執行的jar并不會真正為您做任何事情。 但是,當您進入未知服務器和情況的黃昏區域(沒有IDE和其他工具的情況)時,您就會開始意識到單個可執行jar可以提供多少幫助。

不是嗎

我天真地這么想,并以艱難的方式找到了答案。 讓我一窺。 激發您的編輯人員。 讓我們創建一個可執行的Jar項目。 我使用jdk1.7.0,STS,Maven 3.0.4。 如果您是Maven的新手或剛開始使用,我建議您閱讀
這個和這個 。

檔案:C:\ projects \ MavenCommands.bat

ECHO OFF
REM =============================
REM Set the env. variables.
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.4\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0
REM =============================
REM Standalone java application.
REM =============================
call mvn archetype:generate ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false ^
-DgroupId=foo.bar ^
-DartifactId=executableJar001
pause

運行此批處理文件后,您將擁有一個完全可編譯的標準Java應用程序。 繼續編譯它并構建一個jar(mvn -e clean install)。 您將在C:\ projects \ executableJar001 \ target下獲得一個可執行文件Jar001-1.0-SNAPSHOT.jar。 現在放手'
java -jar jarFileName '。 在這里,您第一次跌倒。 在令人討厭的詞匯表中,它告訴您不存在帶有main方法的類,因此它不知道該執行什么。 幸運的是,這很容易。 有標準的Java程序可以解決它。 并且有一個Maven插件可以解決它。 我將使用后者。

更新的文件:/executableJar001/pom.xml

...<dependencies>...</dependencies><build><plugins><!-- Set main class in the jar. --><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-jar-plugin</artifactid><version>2.4</version><configuration><archive><manifest><mainclass>foo.bar.App</mainclass></manifest></archive></configuration></plugin></plugins></build>...

您可以再次編譯和組裝應用程序(mvn -e clean install)。 它會在目標文件夾中創建一個jar文件。 嘗試再次從命令行運行jar 。 這次您將獲得預期的結果。 所以,我們都被排序了,對吧? 錯誤。 錯了

一切似乎都很好。

讓我們深入研究一下,我們會發現為什么現在所有的東西都不像現在看起來那樣排序。 讓我們繼續添加一個依賴,例如,假設我們要添加日志記錄,為此我們要使用第三方jar,即logback。 我將讓Maven處理開發環境中的依賴項。

更新的文件:/executableJar001/pom.xml

...<dependencies><!-- Logging --><dependency><groupid>ch.qos.logback</groupid><artifactid>logback-classic</artifactid><version>1.0.9</version></dependency></dependencies><build>... </build>

更新的文件:/executableJar001/src/main/java/foo/bar/App.java

package foo.bar;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class App 
{private final static Logger logger = LoggerFactory.getLogger(App.class);public static void main( String[] args ){System.out.println( 'Hello World!' );logger.debug('Hello world from logger.');}
}

現在,讓我們使用jar命令從命令提示符處編譯并運行jar。 你看到發生了什么事嗎?

Exception in thread 'main' java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

基本上是說找不到LoggerFactory的類(即實際代碼)(即我們在開發環境中添加的第3方jar)。

哦,但是可以肯定的是,我們應該能夠告訴Java從某個文件夾中提取第三方庫。

絕對是 如果您要問這個問題,幾乎可以肯定的是,對于大多數應用程序,您都告訴JVM第三方/依賴庫在哪里。 您可以通過設置classpath來告知。 您可能正在使用某些應用程序服務器,例如Tomcat / Jetty,而這本身可能是一些依賴項。 而這正是問題的根源。

作為開發人員,我提供了一個有效的x.jar。 但是,要使其正常工作,它取決于a.jar(這反過來可能取決于b.jar和c.jar……您明白了)。 當我作為開發人員將我的可交付成果x.jar捆綁在一起時,存在依賴關系-取決于我將其分發給誰-確保在應該使用x.jar的其他環境中正確設置類路徑上班。

多數情況下這沒什么大不了的。 但是,這也不是小事。 有多種方法可以弄亂對目標環境的依賴性。 可能會有例行更新。 在同一生產環境中可能還部署了其他一些應用程序,需要在jar上進行更新,沒人認為會影響您的。 我們可以討論和辯論多種方法來阻止此類不幸事件,但是最重要的是x.jar(開發人員責任)具有依賴性(開發人員不直接控制)。 這會導致不幸。

當然,如果將由于不同版本,不同應用服務器等導致的全部變量添加到此混合中,那么僅提供x.jar的現有解決方案很快就會顯得非常脆弱。

那么我們該怎么辦?

對P. Simon Tuffs博士表示感謝。 這位先生在此環節解釋了他如何迎合這個問題。 這是一本好書,我推薦。 我用非常普通的方式解釋過的(幾乎沒有刮過表面),Simon深入探討了該問題及其解決方法。 長話短說, 他編寫了一個解決方案并將其開源 。 我將不再重播相同的信息-閱讀他的文章 ,內容非常豐富-但我將指出他解決方案的重點。

  1. 它使人們可以創建一個包含所有內容(包括代碼,資源,依賴項,應用程序服務器(可能))的jar。
  2. 它允許最終用戶通過簡單的java -jar jarFileName命令來運行整個humongous jar。
  3. 它允許開發人員以與開發相同的方式進行開發,例如,如果是Web應用程序,war文件結構將保持不變。 因此,在開發過程中沒有任何變化。

那么我們如何去做呢?

在很多地方都有詳細的說明。 One-JAR網站 。 與One-JAR的螞蟻 。 具有一罐的Maven 。

讓我們看看它在我們的偽代碼上的作用。 值得慶幸的是,還有一個Maven插件 。 遺憾的是,它不在Maven Central存儲庫中(為什么?伙計們為什么?您投入了98%的工作。為什么對最后2%的工作比較遲鈍?)。 它帶有不錯的
使用說明 。

更新的文件:/executableJar001/pom.xml

...<dependencies>... </dependencies><build><plugins>...<!-- If you wanted to bundle all this in one jar. --><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><!-- Required only if you are usng onejar plugin. --><pluginrepositories><pluginrepository><id>onejar-maven-plugin.googlecode.com</id><url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url></pluginrepository></pluginrepositories>

現在您需要做的就是運行mvn -e clean package。 除了普通的廣口瓶外,您還會得到一個脂肪充足的廣口瓶。 繼續,再次從命令提示符處執行java -jar jarFileName。 它應該工作。

嗯..聽起來不錯。 為什么每個人都沒有這樣做? 而且這個One-JAR似乎是從2004年開始出現的。為什么我們在這個市場上看不到更多參與者?

你知道他們說免費午餐嗎? 沒有了。 盡管這個概念非常簡潔實用,但這并不意味著其他所有參與者都決定加入。因此,如果您的網站“需要”托管在大型付費應用程序服務器之一上(我不知道為什么您希望繼續為那些了解它們的專有軟件和技術人員付費。如果您不只是為高素質的技術人員付費,而是依賴那些不會讓您陷入困境的開源應用程序,那么One-JAR對您來說可能不是一個可行的解決方案。 此外,我聽到關于事情可能會變慢的不確定聲音(如果您的應用很大,則在加載過程中。因此,在決定使用此功能之前,我建議您進行一次POC并確保您的技術堆棧中沒有其他內容對One-JAR不滿意。

我個人認為,2004年對于這種事情可能還為時過早。 人們仍然在為諸如構建和發布過程的標準化,在ORM領域獲得明確的參與者,為MVC框架尋求明確的參與者等之類的問題而苦苦掙扎。這些問題還沒有得到答案,或者很快就會出現。 但是我認為IT世界中當前問題的味道很普遍

  1. 如何使DevOps工作。
  2. 如何使整個構建和發布自動化。
  3. 如何利用開放源代碼庫提供可靠的軟件,同時確保沒有笨重的專有軟件引起鎖定,從而使解決方案的敏捷性降低,以適應未來的業務需求。

在我看來,One-JAR在該地區表現非常出色。 因此,我當然希望看到更多有關此工具和/或圍繞此概念的更多工具。 而且,公平地說,該領域有更多參與者。 感謝Christian Schlichtherle指出了這一點。 有Maven Assembly Plugin和Maven Shade Plugin可以解決這個完全相同的問題。 我還沒有嘗試過它們,但是從文檔上看,它們很不錯,功能很明智。 Dropwizard ,雖然不是同一回事,但本質上非常相似。 他們通過嵌入式應用程序服務器擴展了整個jar的概念,對REST,JSON,Logback的開箱即用支持,以及一個很好的整潔包,您可以直接使用。

因此,正如我一直在說的那樣,現在是從事技術業務的激動人心的時刻,尤其是如果您喜歡修補軟件。

參考: Tech Jar for Enterprise博客上的Jjar合作伙伴 Partho可以對所有這些規則進行統治 。

翻譯自: https://www.javacodegeeks.com/2013/01/one-jar-to-rule-them-all.html

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

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

相關文章

Django集合Ueditor

語言版本環境&#xff1a;python3.6 1、win安裝步驟&#xff1a; 1 git下載源碼https://github.com/zhangfisher/DjangoUeditor 2 解壓DjangoUeditor3-master.tar 3 cd C:\Users\fj\Desktop\DjangoUeditor3-master 4 python setup.py install 官方建議使用pip install Djang…

計算機二級高級應用考題,2016計算機二級MSOFFICE高級應用考試真題

2016計算機二級MSOFFICE高級應用考試真題離2016上半年的計算機等級考試只有一個多月了&#xff0c;為了幫助大家盡快考試過關&#xff0c;小編整理了計算機二級office考試題&#xff0c;希望能幫助到大家!(1)下列敘述中正確的是A)一個算法的空間復雜度大&#xff0c;則其時間復…

ANTLR –語義謂詞

用antlr解析簡單的語法很簡單 。 您要做的就是使用正則表達式描述您的語言&#xff0c;并讓antlr生成詞法分析器和解析器。 解析大型或復雜的語言有時會需要更多&#xff0c;因為僅使用正則表達式描述它們是困難的&#xff0c;甚至是不可能的。 語義謂詞是在語法內部編寫的Jav…

python輸入一個數組輸出24進制式的時間_4.4 用于數組的文件輸入輸出 線性代數...

Numpy能夠讀寫磁盤上的文本數據或二進制數據。這一小節只討論Numpy的內置二進制格式&#xff0c;因為更多的用戶會使用pandas或其它工具加載文本或表格數據(見第6章)。np.save和np.load是讀寫磁盤數組數據的兩個主要函數。默認情況下&#xff0c;數組是以未壓縮的原始二進制格式…

DBMS-數據庫設計與E-R模型:E-R模型、約束、E-R圖、E-R擴展特性、E-R圖轉換為關系模式、UML建模...

設計過程概覽 1. 設計階段 最初階段&#xff1a;刻畫未來數據庫用戶的數據需求&#xff0c;產品為用戶需求規格說明&#xff1b; 概念設計階段&#xff08;conceptual-design phase&#xff09;&#xff1a;&#xff08;關注描述抽象數據及其聯系&#xff0c;通常使用實體-聯系…

tooltip.css-2.0文檔

tooltip.css 純CSS鼠標提示工具。 v. 2.0.0 更新日期&#xff1a;2018.4.12 預覽DEMO。 安裝&#xff1a; 只需在頁面中引入"tooltip.css"或“tooltip.min.css”文件即可。 如&#xff1a; <link rel"stylesheet" href"css/tooltip.css"…

Java虛擬機:如何判定哪些對象可回收?

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請注明出處&#xff0c;歡迎交流學習&#xff01; 在堆內存中存放著Java程序中幾乎所有的對象實例&#xff0c;堆內存的容量是有限的&#xff0c;Java虛擬機會對堆內存進行管理&#xff0c;回收已經“死去”的對象&…

html標簽object和embed,html標簽object和embed的區別

object和embed的區別The code in bold above is the actual code that you need to place in your page to embed a FusionCharts chart.In the above code, weveused and tags to embed the 3D Column Chart (Column3D.swf) within the HTML page.used &dataUrlData.xml u…

Apache Apollo REST API

Apache Apollo是新一代&#xff0c;高性能&#xff0c;多協議的消息傳遞代理&#xff0c;它是從頭開始構建的&#xff0c;可以替代ActiveMQ5.x。 我過去曾在博客上發表過文章 &#xff08;第一部分已經與第二部分一起發布了&#xff09;。 Apollo的非阻塞異步體系結構使其速度…

bzoj1588 [HNOI2002]營業額統計

1588: [HNOI2002]營業額統計 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 17931 Solved: 7391[Submit][Status][Discuss]Description 營業額統計 Tiger最近被公司升任為營業部經理&#xff0c;他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 T…

python管道通信_Python進程通信之匿名管道實例講解

匿名管道管道是一個單向通道,有點類似共享內存緩存.管道有兩端,包括輸入端和輸出端.對于一個進程的而言,它只能看到管道一端,即要么是輸入端要么是輸出端.os.pipe()返回2個文件描述符(r, w),表示可讀的和可寫的.示例代碼如下:復制代碼 代碼如下:#!/usr/bin/pythonimport timeim…

css3中的box-sizing屬性的使用

box-sizing屬性用來定義元素的width和height所表示的區域,該屬性一般有三種值&#xff1a;content-box、border-box、inherit。 其中inherit表示box-sizing的值應該從父元素繼承。 content-box和border-box的主要區別就是元素的width和height的值包不包括border、padding這兩…

ES6擴展運算符...進行的數組刪除

今天寫了按照React小書寫了Reducer&#xff0c;發現基礎真是太重要了&#xff0c;所有關于上層建筑的細節都需要回到下層細節中去尋找&#xff0c;而且現在的基礎也由ES3變成了ES6了。 const ADD_USER "ADD_USER" const DELETE_USER "DELETE_USER" const…

中南大學在線考試答案計算機基礎,中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc...

中南大學《計算機基礎》在線考試題庫(267題)(有答案).doc 計算機基礎01 總共89題共100分 一. 單選題 (共35題,共35分) 1. 域名服務器DNS的主要功能是( )。 (1分) A.通過請求及回答獲取主機和網絡相關的信息 B.查詢主機的MAC地址 C.為主機自動命名 D.合理分配IP地址 ★標準答案&…

自動化的OSGi測試運行器

在我的團隊成員中&#xff0c;我以忘記維護&#xff08;JUnit&#xff09;測試套件而聞名。 我只是無法為此付出額外的手動為套件添加測試的步驟。 幸運的是&#xff0c;有連續的集成服務器通過命名模式收集測試。 如果我介紹的一項孤立測試失敗了&#xff0c;那么它會脫穎而出…

php post請求后端拿不到值_PHP Post獲取不到非表單數據的問題解決辦法

問題描述在使用vue-axios向后端post數據時&#xff0c;PHP端獲取不到post的數據。問題解決修改php.ini配置找到php.ini配置文件&#xff0c;查找enable_post_data_reading變量&#xff0c;修改為打開狀態&#xff0c;注釋掉句前分好; Whether PHP will read the POST data.; Th…

CSS制作簡單loading動畫

曾經以為&#xff0c;loading的制作需要一些比較高深的web動畫技術&#xff0c;后來發現大多數loading都可以用“障眼法”做出來。比如一個旋轉的圓圈&#xff0c;并不都是將gif圖放進去&#xff0c;有些就是畫個靜止圖像&#xff0c;然后讓它旋轉就完了。gif圖也可以&#xff…

機器學習:多變量線性回歸

************************************** 注&#xff1a;本系列博客是博主學習Stanford大學 Andrew Ng 教授的《機器學習》課程筆記。博主深感學過課程后&#xff0c;不進行總結非常easy遺忘&#xff0c;依據課程加上自己對不明確問題的補充遂有此系列博客。本系列博客包含線性…

Java對象復活

總覽 收集覆蓋了finalize&#xff08;&#xff09;的對象之后&#xff0c;將其添加到終結處理隊列中&#xff0c;以在調用每個對象的finalize&#xff08;&#xff09;方法之后進行清理。 如果您復活該物體&#xff0c;會發生什么&#xff1f; 何時定稿&#xff1f; finalize方…

經過路由無法找到計算機,電腦無法啟動服務提示系統找不到指定的路徑(圖)

原標題&#xff1a;"電腦無法啟動服務提示系統找不到指定的路徑"相關電腦問題教程分享。 - 來源:191路由網。眾所周知&#xff0c;使用電腦的時候需要啟動一些服務才能使用相關的功能&#xff0c;但是如果出現無法啟動服務項&#xff0c;并且提示“錯誤3&#xff1a;…