本文目錄一覽:
- 1、java開發所說的api是什麼?jar又是什麼?怎麼理解,我只知道jar包是程序運行所需的。
- 2、java怎麼打包成jar?
- 3、java的擴展jar包有哪些
- 4、關於java動態載入jar的問題?
- 5、如何用jar命令對java工程進行打包
- 6、昆明電腦培訓分享java中自動化構建工具
java開發所說的api是什麼?jar又是什麼?怎麼理解,我只知道jar包是程序運行所需的。
學Java的人經常遇到的一個問題是:如果一個程序依賴某個文件夾下的一堆jar包,那麼啟動它的時候就需要在java -cp參數後面一個一個的加上jar包的名稱,很不方便。 比如主程序類叫Main,在目錄lib下有aaa.jar,bbb.jar,ccc.jar,則需要輸入以下命令才能執行:java -cp lib/aaa.jar;lib/bbb.jar;/lib.ccc.jar Main (linux系統下用冒號,windows下用分號)。 如果jar包少,倒也不是很麻煩,但如果依賴的jar包數量很多的話,一個個的輸就比較麻煩了,當然我們也可以藉助一些腳本或者Ant來實現自動化,但總覺得殺雞焉用牛刀,反而把事情弄麻煩了。 我自己是這樣解決的:java-Djava.ext.dirs =./lib -cp ./bin Main (假設主程序類Mian.class放在bin目錄下) 正如你說看到的,-Djava.ext.dirs起到了關鍵作用,它將告訴JVM從那裡載入一些類,為了方便理解記憶,順便補充一點ClassLoader的常識: Java的類裝載模型是一種代理(delegation)模型。當JVM 要求類裝載器CL(ClassLoader)裝載一個類時,CL首先將這個類裝載請求轉發給他的父裝載器。只有當父裝載器沒有裝載並無法裝載這個類時, CL才獲得裝載這個類的機會。這樣, 所有類裝載器的代理關係構成了一種樹狀的關係。樹的根是類的根裝載器(bootstrap ClassLoader) , 在JVM 中它以null表示。除根裝載器以外的類裝載器有且僅有一個父裝載器。在創建一個裝載器時, 如果沒有顯式地給出父裝載器, 那麼JVM將默認系統裝載器為其父裝載器。 根(Bootstrap) 裝載器:該裝載器沒有父裝載器,它是JVM實現的一部分,從sun.boot.class.path裝載運行時庫的核心代碼。
java怎麼打包成jar?
^^java教程^^《製作可執行JAR》本文闡述了如何把一個不可執行的 JAVAArchive(JAR)文件變成可執行,而不用直接操作manifest文件。你會學到寫出短小的一個程序,通過運行java-jar命令或在像windows一樣的操作系統裡面用雙擊滑鼠運行任何JAR文件。
你可以很容易地把應用程序的一整套class文件和資源文件打包到一個JAR中。事實上這就是jar文件存在的一個目的。另外一個目的就是讓用戶能很容易地執行被打包到jar文件裡面的應用程序。那麼為什麼jar文件僅僅作為文件在整個java裡面佔據了次要的地位,而本地執行則被忽視?
要執行一個jar文件,你可以使用java命令的-jar選項。舉一個例子來說,假如你有個名叫myjar.jar的文件。這個jar是可以運行的,你可以運行它:java-jarmyjar.jar.另外一個辦法就是,當JavaRuntimeEnvironment(JRE)已經被安裝到一個像windows的操作系統上,將jar文件與JVM關聯(關聯 java.exe跟jar文件)在一起你就可以通過雙擊jar來運行這個應用程序。當然,jar文件必須是可執行的。
現在的問題是:如何做一個可以執行的jar?
manifest文件以及Main-class入口
在大多數jar中,都在一個叫META-INF的目錄裡面保存了一個叫MANIFEST.MF的文件。那個文件裡面,
包含了一個特殊表項名字叫Main-Class,告訴java-jar命令應該執行哪個class.
問題是你必須為manifest文件手工加入適當表項,而且必須在一定的位置和用一定的格式。不幸的是,不是每個人都喜歡打開寫字板編輯配置文件。
讓API幫你完成任務
自從java1.2發布以來,一個叫java.uil.jar包的出現,讓你能夠方便處理jar文件。(注意:該包基於java.util.zip)特別地,jar包讓你通過Mainfest類,可以容易操作那些manifest文件.
就讓我們用這個API寫一個程序吧。首先,這個程序必須知道三樣東西:
1。我們要使之可運行的jar文件。
2。運行jar的主類(這個類必須包含在jar中)。
3。輸出新jar文件的文件名,因為我們不能簡單地覆蓋原來的文件。
編寫程序
上面列表的三點要求將組成我們的程序的參數。現在,讓我們為這個程序選擇一個適當的名字。
MakeJarRunnable聽起來覺得怎樣?
為main方法檢查參數
假設我們的main方法入口點是一個標準的main(String[])方法。我們應該這樣檢查程序的參數:
if(args.length!=3){
System.out.println(“Usage:MakeJarRunnable” “jarfileMain-Classoutput”);
System.exit(0);
}
請注意參數列表是如何描述的,因為這在以下代碼中是很重要的。參數的次序和內容不是固定的;
然而,如果你要改變他們的話,要記住響應修改其他代碼。
訪問jar和jar的manifest文件
第一,我們必須創建一些了解jar和manifest的對象:
//CreatetheJarInputStreamobject,andgetitsmanifest
JarInputStreamjarIn=newJarInputStream(newFileInputStream(args[0]));
Manifestmanifest=jarIn.getManifest();
if(manifest==null){
//Thiswillhappenifnomanifestexists
manifest=newManifest();
}
設置Main-Class屬性
我們把Main-Class入口放到manifest文件的main屬性部分。一旦從manifest對象獲得這個屬性,就可以設置需要的 mainclass。然而,如果main-Class屬性已經存在原來的jar當中又如何呢?這裡我們只是簡單地輸出一個警告然後退出。我們能加入一個命令行參數告訴程序使用新的值,而代替了舊的那個:
Attributesa=manifest.getMainAttributes();
StringoldMainClass=a.putValue(“Main-Class”,args[1]);
//Ifanoldvalueexists,telltheuserandexit
if(oldMainClass!=null){
System.out.println(“Warning:oldMain-Classvalueis:”
oldMainClass);
System.exit(1);
}
輸出新的JAR
我們需要創建一個新的JAR文件,所以我們必須使用JarOutputStream類。注意:
我們必須確定我們不用跟輸入文件相同的名字作為輸出文件的名字。還有一個方案就是,程序應該考慮到一種情況,就是兩個jar文件都是相同的,促使用戶覆蓋原來的文件,如果他願意這麼做的話。然而,我在保留了這一點,作為讀者的一個練習。從如下代碼開始:
System.out.println(“Writingto” args[2] “…”);
JarOutputStreamjarOut=newJarOutputStream(newFileOutputStream(args[2]),manifest);
我們必須從輸入JAR寫每個表項到輸出的JAR,所以迭代每個表項:
//Createareadbuffertotransferdatafromtheinput
byte[]buf=newbyte[4096];
//Iteratetheentries
JarEntryentry;
while((entry=jarIn.getNextJarEntry())!=null){
//ExcludethemanifestfilefromtheoldJAR
if(“META-INF/MANIFEST.MF”.equals(entry.getName()))continue;
//WritetheentrytotheoutputJAR
jarOut.putNextEntry(entry);
intread;
while((read=jarIn.read(buf))!=-1){
jarOut.write(buf,0,read);
}
jarOut.closeEntry();
}
//Flushandcloseallthestreams
jarOut.flush();
jarOut.close();
jarIn.close();
完成程序
當然,我們必須把這些代碼放到一個類的main方法裡面,並且需要一大堆import代碼。完整程序:
程序使用例子
讓我們把這個程序應用到一個例子裡面來。假設你有一個應用程序,該程序的入口點是一個叫HelloRunnableWorld的類,再假設你已經創建了一個jar叫myjar.jar,包含了整個程序。運行MakeJarRunnable:
javaMakeJarRunnablemyjar.jarHelloRunnableWorldmyjar_r.jar
正如前面提到的,注意一下我的參數順序。如果你忘記了順序,沒有參數運行一下程序,它會響應出現一個用法提示信息。
嘗試對myjar.jar運行java-jar命令。然後對myjar_r.jar。注意區別不同!好了,你完成了這一切了,瀏覽一下每個jar的manifest文件(META-INF/MANIFEST.MF)
java的擴展jar包有哪些
jar包 用途
axis.jar SOAP引擎包
commons-discovery-0.2.jar 用來發現、查找和實現可插入式介面,提供一些一般類實例化、單件的生命周期管理的常用方法.
jaxrpc.jar Axis運行所需要的組件包
saaj.jar 創建到端點的點到點連接的方法、創建並處理SOAP消息和附件的方法,以及接收和處理SOAP錯誤的方法.
wsdl4j-1.5.1.jar Axis運行所需要的組件包
activation.jar JAF框架的jar包
annotations-api.jar 使用註解所需jar
ant.jar 用於自動化調用程序完成項目的編譯,打包,測試等
aopalliance-1.0.jar 支持Spring AOP
asm-2.2.3.jar ASM位元組碼庫
asm-commons-2.2.3.jar ASM位元組碼庫
asm-util-2.2.3.jar Java位元組碼操縱和分析框架
aspectjrt.jar 處理事務和AOP所需的包
aspectjweaver.jar 處理事務和AOP所需的包
axiom-api-1.2.7.jar Axis 對象模型
axiom-impl-1.2.7.jar Axis 對象模型
bcprov-jdk15-140.jar 基於java1.5 的加密演算法實現
bfmclientmodel.jar 使用WebSphere所需jar包
bpcclientcore.jar 使用WebSphere所需jar包
bpe137650.jar 提供遠程訪問BPE容器的實現。
bsh-2.0b4.jar 解決負載邏輯運算
c3p0-0.9.0.jar 開放源代碼的JDBC連接池
cglib-nodep-2.1_3.jar Spring中自動代理所需jar包
cobertura.jar 測量測試覆蓋率
commons-beanutils-1.7.0.jar 動態的獲取/設值Java Bean的屬性
commons-chain-1.1.jar 實現責任鏈設計模式的Java 類庫
commons-codec-1.3.jar 用來處理常用的編碼方法的工具類包,例如DES、SHA1、MD5、Base64等等
commons-collections-3.1.jar 對標準java Collection的擴展
commons-collections.jar 對標準java Collection的擴展
commons-digester-1.8.jar 用於處理struts-config.xml配置文件
commons-fileupload-1.1.1.jar struts上傳文件
commons-httpclient-3.1.jar 用來簡化HTTP客戶端與伺服器端進行各種通信編程實現
commons-io-1.1.jar 針對java.io.InputStream和Reader進行了擴展
commons-lang-2.4.jar 對java.lang.*的擴展
commons-logging-1.1.1.jar 日誌包
commons-pool-1.3.jar 實現對象池化框架
commons-validator-1.3.1.jar 用來把驗證規則程序提取出來,以供重複使用
db2jcc.jar java連接DB2所需jar
db2jcc_license_cu.jar java連接DB2所需jar
dom4j-1.6.1.jar 解析XML
ehcache-1.2.4.jar hibernate的二級緩存如果用ehcache的時候需要此jar包
emf.jar 基於Eclipse的模型框架
ezmorph-1.0.6.jar 使用JSON所需的jar包
FastInfoset-1.2.2.jar 使用WebService所需的jar包
freemarker-2.3.8.jar Strus2支持的一種表現層框架
geronimo-activation_1.1_spec-1.0.2.jar Apache Geronimo所帶jar包,
geronimo-annotation_1.0_spec-1.1.1.jar Apache Geronimo所帶jar包
geronimo-javamail_1.4_spec-1.3.jar Apache Geronimo所帶jar包
geronimo-jaxws_2.1_spec-1.0.jar Apache Geronimo所帶jar包
geronimo-jms_1.1_spec-1.1.1.jar Apache Geronimo所帶jar包
geronimo-servlet_2.5_spec-1.2.jar Apache Geronimo所帶jar包
geronimo-stax-api_1.0_spec-1.0.1.jar Apache Geronimo所帶jar包
hibernate3.jar Hibernate3的核心jar包
htmclientmodel.jar 使用WebSphere所需jar包
jakarta-oro.jar 一套文本處理工具,提供per15.0兼容的表達式,AWK-like表達式,Glob表達式。
javassist.jar Javassist 位元組碼解釋器
jaxb-api-2.1.jar 使用WebService所需的jar包
jaxb-impl-2.1.7.jar 使用CXF所需jar包
jaxb-xjc-2.1.7.jar 使用CXF所需jar包
jaxen-1.1.1.jar 解析XML
jcifs-1.2.22.jar 實現單點登陸
jdom2-1.0.jar 解析XML
jdom-1.0.jar 解析XML
jettison-1.0.1.jar 使用CXF所需jar包
jetty-6.1.9.jar Jetty Http伺服器jar
jetty-util-6.1.9.jar Jetty Http伺服器jar
jra-1.0-alpha-4.jar 使用CXF所需jar包
js-1.6R7.jar 使用CXF所需jar包
json-lib-2.2.3-jdk13.jar 使用JSON所需的jar包
jsonplugin-0.25.jar strus2的JSON插件
jsr311-api-0.8.jar 使用CXF所需jar包
jstl.jar JSTL標籤庫
jta.jar 標準的 JAVA 事務處理介面
junit.jar 用於單元測試
jxl.jar 通過java操作excel表格的工具類庫
ldap.jar JNDI目錄服務和LDAO伺服器所需的jar
ldapbp.jar JNDI目錄服務和LDAO伺服器所需的jar
log4j-1.2.15.jar 提供日誌功能
mail.jar java發送郵件jar包
neethi-2.0.4.jar 使用CXF所需jar包
odmg-3.0.jar ODMG是一個ORM的規範,Hibernate實現了ODMG規範,這是一個核心的庫
ognl-2.6.11.jar struts2中OGNL語言
ojdbc14.jar Oracle資料庫驅動包
opensaml-1.1.jar 使用CXF所需jar包
oro-2.0.8.jar Validator框架所需的jar包
oscache-2.1.jar Java 對象的緩存工具
poi-3.1-FINAL-20080629.jar 操作exce所需jar包
poi-contrib-3.1-FINAL-20080629.jar 操作exce所需jar包
poi-ooxml-3.6-20091214.jar 提供對office的word、excel、visio及ppt的操作
poi-ooxml-schemas-3.6-20091214.jar 提供對office的word、excel、visio及ppt的操作
poi-scratchpad-3.1-FINAL-20080629.jar 提供對office的word、excel、visio及ppt的操作
processCommon.jar IBM WebSphere 運行所需jar
ProcessCommonLibrary.jar IBM WebSphere 運行所需jar
processIdentity.jar IBM WebSphere 運行所需jar
ProcessInformation.jar 進程監視軟體包
proxool-0.9.1.jar 資料庫連接池
proxool-cglib.jar 資料庫連接池
quartz-1.6.0.jar 開源作業調度框架
saaj-api-1.3.jar 使用axis所需的jar
saaj-impl-1.3.2.jar 使用axis所需的jar
serializer-2.7.1.jar XML序列化
slf4j-jdk14-1.5.6.jar 整合各種日誌框架的工具
spring208.jar spring核心框架
spring-ldap-1.2-RC1.jar spring下LDAP
spring-mock.jar spring的測試框架
standard.jar 使用JSTL標籤庫所需的jar
stax-api-1.0.1.jar 解析XML
struts2-core-2.0.14.jar struts2核心jar
struts2-spring-plugin-2.0.6.jar struts2整合Spring所需jar
taglibs-datetime.jar Apache開源組織提供標籤庫,用于格式化日期。
taglibs-mailer.jar 用於發送郵件
taglibs-string.jar Apache開源組織提供標籤庫,用於對String的操作。
task137650.jar Portal技術在SOA系統集成應用中實現所需的jar
utility.jar Apache開源組織提供標籤庫
velocity-1.5.jar 一個免費的開源模板框架
wsdl4j-1.6.2.jar 用來解析服務的WSDl文件
wss4j-1.5.4.jar 創建CXF所需jar
wstx-asl-3.2.6.jar 創建CXF所需jar
xbean-spring-2.8.jar 使用xfire所需jar
xerces-2.6.2.jar XML解析器
xfire-all-1.2.6.jar 用於實現WebService
XmlSchema-1.1.jar 使用xfire所需jar
xwork-2.0.7.jar WebWork核心jar
這只是一部分,還有很多。
關於java動態載入jar的問題?
設我們有一個hello.jar文件,裡面有一個Util類,我們希望在運行期調將這個jar包放入到我們運行環境並且調用裡面的Util.getVersion方法。怎麼實現?
在java中,我們的類都是通過ClassLoader來載入的,同時ClassLoader具有層級關係,當某個類找不到時,它會去他的父類載入器去尋找,如果依然找不到,就拋出ClassNotFoundException了。
為了動態載入hello.jar裡面的Util類,我們需要將這個jar包放入到我們的類載入器中去,然後再獲取裡面的類。如下面的代碼。
// 位於hello.jar
package com.flyingzl;
public class Util {
public static void getVersion(){
System.out.println(“java version: ” + System.getProperty(“java.version”));
}
}
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Main {
public static void main(String[] args) {
URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);
try {
classLoader.addJar(new File(“c:/hello.jar”).toURI().toURL());
Class? clazz = classLoader.loadClass(“com.flyingzl.Util”);
Method method = clazz.getDeclaredMethod(“getVersion”);
method.invoke(null);
classLoader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
static class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public void addJar(URL url) {
this.addURL(url);
}
}
}
注意:這裡僅僅是為了展示如何動態載入jar包,代碼寫得很粗,生產代碼需要有更完善的異常處理。我們只關心如何動態載入jar包即可。
動態載入jar包,需要用到java.net.URLClassLoader這個類,它可以指定一個路徑將jar包或者classes文件載入到類空間。載入完畢後,直接調用loadClass就可以載入指定的類,然後通過反射生成實例或者調用方法即可。
其實,Tomcat等伺服器也利用了此思路,比如每一個web應用啟動時,它都會自動載入其下的lib文件夾下的jar包。
運行程序,我們就可以看到程序正常輸出:
java version: 1.7.0_03
如何用jar命令對java工程進行打包
一. jar命令用法:
在cmd命令窗口下輸入jar,回車,就會提示改命令的用法:
二.例子(這裡介紹的都是生成雙擊可執行的jar包):
1.首先介紹如何在命令行下執行打包程序。
1.1.沒有包結構的最簡單的工程。
(1)在c:盤下新建文件「HelloWorld.java」:
1 public class HelloWorld
2 {
3 public static void main(String[] args){
4 System.out.println(“Hello world!”);
5 }
6 }
(2)在命令行下輸入c:\javac HelloWorld.java,在c:盤下編譯生成「HelloWorld.class」。
(3)在c:盤下新建文件「menefest」(沒有後綴名):
Main-Class: HelloWorld
注意最後要有一個空行,否則會出現找不到類的錯誤。
(4)打包:輸入c:\jar cvmf menifest HelloWorld.jar HelloWord.jar HelloWorld.class,在c:盤下生成「HelloWorld.jar」。
(5)執行:輸入c:\java -jar HelloWord.jar。屏幕回顯「HelloWorld」。
1.2.有包結構的java工程。
(1)在c:\com\gosyl\demo\下新建文件「HelloWorld.java」:
package com.gosyl.demo;
public class HelloWorld{
public static void main(String[] args){
System.out.println(“HelloWorld”);
}
}
(2)在命令行下輸入c:\javac com/gosyl/demo/HelloWorld.java,在c:\com\gosyl\demo\文件夾下編譯生成「HelloWorld.class」。
(3)在c:盤下新建文件「menefest2」(沒有後綴名):
Main-Class: com.gosyl.demo.HelloWorld
注意最後要有一個空行,冒號後面要一個空格。否則會出現找不到類的錯誤。
(4)打包:輸入c:\jar cvmf menifest2 HelloWorld.jar HelloWord.jar com/,在c:盤下生成「HelloWorld.jar」。
(5)執行:輸入c:\java -jar HelloWord.jar。屏幕回顯「HelloWorld」。
1.3.引用到外部jar包的java工程。
(1)在c:\com\gosyl\demo\下新建文件「Car.java」:
package com.gosyl.demo;
public class Car
{
public static void main(String[] args){
Light.on();
}
}
(2)在c:\com\gosyl\demo\下新建文件「Light.java」:
package com.gosyl.demo;
class Light
{
public static void on(){
System.out.println(“Light is on!”);
}
}
(3)打包1:輸入c:\jar cvf Light.jar com/gosyl/demo/Light.class,在c:盤下生成「Light.jar」。
(4)在c:盤下新建文件「menefest-car」(沒有後綴名):
Main-Class: com.gosyl.demo.Car
Class-Path: Light.jar
注意最後要有一個空行,冒號後面要一個空格。否則會出現找不到類的錯誤。
(5)打包2:輸入c:\jar cvmf menifest-car Car.jar com/gosyl/demo/Car.class,在c:盤下生成「Car.jar」。
(6)執行:輸入c:\java -jar Car.jar。屏幕回顯「Light is on」。
三.總結
1.清單文件menifest,對格式要求很高,注意每個冒號後面要有一個空格,文件最後要有一個空行。
2.對於引用到外部jar包的工程,需要在manifest中定義好Class-Path屬性。
3.對於雙擊.bat文件出現刷屏現象的情況,請直接把.bat文件的內容鍵入命令行執行。
4.對於重複簽名的jar包,在META-INF裡面會出現多個簽名文件,刪除掉多餘的,保存其中一個才能保證jws正常啟動。
昆明電腦培訓分享java中自動化構建工具
一個大型的java項目的開發往往需要載入很多的各式各樣的第三方jar包依賴,這時就需要專門工具來維護這些繁雜的jar包,否則各個jar包的版本問題,依賴問題會讓你頭很大,當多個團隊協作開發時,項目的標準框架配置也需要能夠快速在不同團隊之間複製,另外項目從創建、開發、測試、發布的整個項目生命周期也需要專門的工具來維護。
自動化構建工具就是為了解決以上這些問題的。
目前比較主流的自動化構建工具主要有:Maven、gradle、Ant等。其中Ant已經走下坡路,除了維護以前的老項目以外,已經基本沒有公司用了。過去幾年中Maven已經成為java項目的事實構建工具,沒有之一。而近兩年Gradle獲得越來越多的人使用,分走了不少Maven的用戶。在這我們主要了解一下Maven和gradle。
Maven
Maven是一個採用純Java編寫的開源項目管理工具。它包含了一組標準集合,一個項目生命周期(ProjectLifecycle),一個依賴管理系統(DependencyManagementSystem),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。Maven採用了一種被稱之為projectobjectmodel(POM)概念來管理項目,所有的項目配置信息都被定義在一個叫做POM.xml的文件中,通過該文件,Maven可以管理項目的整個生命周期,包括編譯,構建,測試,發布,報告等等。
gradle
Gradle是一個基於ApacheAnt和ApacheMaven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,拋棄了基於XML的各種繁瑣配置。面向Java應用為主。當前其支持的語言限於Java、Groovy和Scala,計劃未來將支持更多的語言。
和Maven一樣,Gradle只是提供了構建項目的一個框架,真正起作用的是Plugin。Gradle在默認情況下為我們提供了許多常用的Plugin,其中包括有構建Java項目的Plugin,還有War,Ear等。昆明電腦培訓發現與Maven不同的是,Gradle不提供內建的項目生命周期管理,只是javaPlugin向Project中添加了許多Task,這些Task依次執行,為我們營造了一種如同Maven般項目構建周期。
原創文章,作者:BBEKS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/331403.html