本文目录一览:
- 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般项目构建周期。