`

Java Jar 命令

阅读更多
    你是否在使用java -jar参数运行打包好的jar应用程序的时候发现应用程序无法找到classpath下设置好的第三方类库的内容?无论怎么设置classpath参数都无济于事,总是会报ClassNotFound的错误?那么本篇帖子可以帮助你摆脱烦恼
当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本身yourJarExe.jar的内部class作为类的寻找范围。

**解决方案**

一 BootStrap class扩展方案

Java 命令行提供了如何扩展bootStrap 级别class的简单方法.
-Xbootclasspath:     完全取代基本核心的Java class 搜索路径.
                                   不常用,否则要重新写所有Java 核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面.常用!!
-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免
                                   引起不必要的冲突.

语法如下:
(分隔符与classpath参数类似,unix使用:号,windows使用;号,这里以unix为例)
java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

二 extend class 扩展方案

Java exten class 存放在{Java_home}\jre\lib\ext目录下.当调用Java时,对扩展class路径的搜索是自动的.总会搜索的.这样,解决的方案就很简单了,将所有要使用的第三方的jar包都复制到ext 目录下.

三 User class扩展方案

当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.
步骤如下:

1.将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib 等类似的子目录下.

2.修改Manifest 文件

在Manifest.mf文件里加入如下行

Class-Path:classes12.jar lib/thirdlib.jar

Class-Path 是可执行jar包运行依赖的关键词.详细内容可以参考 http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html 。要注意的是 Class-Path 只是作为你本地机器的CLASSPATH环境变量的一个缩写,也就是说用这个前缀表示在你的jar包执行机器上所有的CLASSPATH目录下寻找相应的第三方类/类库。你并不能通过 Class-Path 来加载位于你本身的jar包里面(或者网络上)的jar文件。因为从理论上来讲,你的jar发布包不应该再去包含其他的第三方类库(而应该通过使用说明来提醒用户去获取相应的支持类库)。如果由于特殊需要必须把其他的第三方类库(jar, zip, class等)直接打包在你自己的jar包里面一起发布,你就必须通过实现自定义的ClassLoader来按照自己的意图加载这些第三方类库。


以上三种方法推荐第一种,扩展性好,操作起来也最方便.
另外编写自己的ClassLoader,来动态载入class,是更加复杂和高级技术.限于篇幅,不赘述.有兴趣了解可以去google一下custom classloader,或者参考我的另一篇日志:让classpath参数走开。

Java的安全机制随不同的JDK版本有不同的变化,会影响很多核心CLASS,比如Thread,所以很多大型商业软件,要求JDK的版本很严格.部分原因也在此.这也要求在发布自己编写的应用时候,不管大小,都要说明开发和测试的JDK版本.


本文所述方法测试基于j2sdk 1.4.2_04-b05

----------------------------------------------------------------------------------------------

附:背景知识

自JDK 1.2以后,JVM采用了委托(delegate)模式来载入class.采用这种设计的原因可以参考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机制.


Java虚拟机(JVM)寻找Class的顺序

1. Bootstrap classes

属于Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心级别的class.这是由JVM Bootstrap class loader来载入的.一般是放置在{java_home}\jre\lib目录下

2. Extension classes

基于Java扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放置在{Java_home}\jre\lib\ext目录下

3. User classes

开发人员或其他第三方开发的Java程序包.通过命令行的-classpath或-cp,或者通过设置CLASSPATH环境变量来引用.JVM通过放置在{java_home}\lib\tools.jar来寻找和调用用户级的class.常用的javac也是通过调用tools.jar来寻找用户指定的路径来编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.

3.1 缺省值:调用Java或javawa的当前路径(.),是开发的class所存在的当前目录
3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值
3.3 执行Java的命令行-classpath或-cp的值,如果制定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值
3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略.JVM APPClassloader将只会以jar包为搜索范围.
有关可执行jar有许多相关的安全方面的描述,可以参考http://java.sun.com/docs/books/tutorial/jar/ 来全面了解.

这也是为什么应用程序打包成可执行的jar包后,不管你怎么设置classpath都不能引用到第三方jar包的东西了.

常用参考
功能说明: 
  Java归档工具 

语法: 
  jar [ 命令选项 ] [manifest] destination input-file [input-files] 

补充说明: 
   jar工具是个java应用程序,可将多个文件合并为单个JAR归档文件。jar是个多用途的存档及压缩工具,它基于ZIP和ZLIB压缩格式。然而, 设计jar的主要目的是便于将java applet或应用程序打包成单个归档文件。将applet或应用程序的组件(.class 文件、图像和声音)合并成单个归档文件时,可以用java代理(如浏览器)在一次HTTP事务处理过程中对它们进行下载,而不是对每个组件都要求一个新连 接。这大大缩短了下载时间。jar还能压缩文件,从而进一步提高了下载速度。此外,它允许applet的作者对文件中的各个项进行签名,因而可认证其来 源。jar工具的语法基本上与tar命令的语法相同。

命令选项 
  -c 在标准输出上创建新归档或空归档。

  -t 在标准输出上列出内容表。 

  -x[file] 从标准输入提取所有文件,或只提取指定的文件。如果省略了file,则提取所有文件;否则只提取指定文件。 

  -f 第二个参数指定要处理的jar文件。在-c(创建)情形中,第二个参数指的是要创建的jar文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中,第二个参数指定要列出或抽取的jar文件。

  -v 在标准错误输出设备上生成长格式的输出结果。 

  -m 包括指定的现有清单文件中的清单信息。用法举例:“jar cmf myManifestFile myJarFile *.class”

  -0 只储存,不进行 ZIP 压缩。 

  -M 不创建项目的清单文件。 

   -u 通过添加文件或更改清单来更新现有的 JAR 文件。例如:“jar -uf foo.jar foo.class”将文件 foo.class 添加到现有的JAR文件foo.jar中,而“jar umf manifest foo.jar”则用manifest中的信息更新foo.jar的清单。 

  -C 在执行 jar 命令期间更改目录。例如:“jar -uf foo.jar -C classes *”将classes目录内的所有文件加到foo.jar中,但不添加类目录本身。 

程序示例 
  1:将当前目录下所有CLASS文件打包成新的JAR文件: 
  jar cf file.jar *.class 

  2:显示一个JAR文件中的文件列表 
  jar tf file.jar 

  3:将当前目录下的所有文件增加到一个已经存在的JAR文件中 
  jar cvf file.jar * 


分享到:
评论

相关推荐

    java jar命令

    `javajar`命令作为Java开发环境中的一个重要组成部分,主要用于创建、管理和操作Java Archive (JAR) 文件。JAR 文件本质上是一种压缩格式,它允许开发者将多个Java类文件、资源文件(如图片、音频等)以及元数据打包...

    javajar命令的使用.doc

    ### javajar命令详解 #### 一、概述 `javajar`命令是Java开发工具包(JDK)中的一个重要组成部分,主要用于创建、更新、提取或验证Java归档(JAR)文件。JAR文件是一种压缩格式,类似于ZIP文件,用于打包Java类库、...

    将java文件打包成 jar jar命令详解

    ### Java 文件打包成 JAR 文件详解 #### 一、JAR 命令概述 JAR(Java Archive)是 Java 开发工具包 (JDK) 中的一个实用程序,用于将多个 Java 类文件和其他资源文件打包成一个 JAR 文件。JAR 文件不仅便于分发和...

    jar 命令详解 java开发工具

    JAR 命令详解 Java 开发工具 JAR 命令是 Java 开发中常用的工具之一,它用于创建、查看和更新 JAR 文件包。JAR 文件包是一种存档文件格式,用于存储 Java 类、资源和配置文件等。JAR 命令提供了多种选项和参数,...

    关于执行java命令引入外部jar包方法

    ### 二、执行Java命令引入外部JAR包的方法 #### 方法1:修改系统环境变量 最常见的方式是通过修改系统环境变量`CLASSPATH`来添加外部JAR包。`CLASSPATH`环境变量告诉JVM在哪里可以找到用户自定义的类和资源。例如...

    sh脚本启动java -jar

    在Linux环境中,`sh`脚本是常用的自动化工具,用于执行一系列命令,特别是在启动Java应用程序时,如`java -jar`。这个标题和描述表明我们要讨论的是如何通过编写一个简单的Shell脚本来启动Java的JAR文件。这通常适用...

    把java文件打包成.jar_(jar命令详解).doc

    ### Java 文件打包成 .jar 文件及 jar 命令详解 #### 一、jar 命令概述 在 Java 开发中,经常会遇到需要将多个类文件或者资源文件打包成一个单独的 `.jar` 文件的需求。`.jar` 文件类似于 `.zip` 文件,是一种将多...

    java生成Jar文件命令

    在Java开发过程中,将源代码编译成可执行的...总的来说,Java生成Jar文件是一个常见的任务,理解并掌握`jar`命令的使用对于Java开发者来说非常重要。通过熟练运用这些命令,你可以更高效地管理和分发你的Java应用程序。

    java配置数据库jar包操作

    Java 配置数据库 Jar 包操作 Java 配置数据库 Jar 包操作是指在 Java 项目中将 MySQL 数据库的 Jar 包导入到项目中,以便使用 JDBC 连接数据库的操作。下面是关于 Java 配置数据库 Jar 包操作的详细知识点: 什么...

    java打包成jar

    通过上述方法,无论是手动使用`jar`命令还是利用Eclipse IDE,开发者都能够轻松地将Java项目打包成可执行的JAR文件。这些打包技巧不仅适用于简单的项目,也适用于具有复杂依赖关系的大规模应用程序。掌握这些技能...

    可以直接运行java jar Demo

    标题中的“可以直接运行java jar Demo”意味着这是一个Java应用程序的可执行jar文件,通常用命令`java -jar Demo.jar`即可在支持Java的环境中运行。这个Demo不仅包含了编译后的Java类,还可能包括了源代码,以便用户...

    JAR文件包及jar命令详解

    Java Archive (JAR) 文件是Java程序中常用的打包格式,它允许将多个类文件、资源文件和其他相关文件组合成一个单一的归档文件。JAR文件不仅方便了代码的分发和存储,还支持压缩,减少了文件占用的空间。此外,JAR...

    通过jar命令生成可执行的jar文件

    输入打包jar命令:jar -cvfe test.jar JFrameDemo3 . (点表示当前目录, JFrameDemo3为jar的入口程序<即存放main方法的类>) 3. 命令执行后会在temp目录下生成一个test.jar 文件双击此文件即可执行 注意:此时生成...

    dos命令测试java jar文件 命令行下运行JUnit测试 命令运行java

    这里我们主要探讨如何使用DOS命令来测试Java JAR文件,以及如何在命令行下运行JUnit测试。这是一项基础但至关重要的技能,因为通过命令行工具可以高效地自动化测试和调试代码。 首先,让我们了解Java JAR文件。JAR...

    java jar包查看工具

    Java的JAR(Java Archive)文件是Java平台特有的打包格式,用于集合多个类文件、资源文件等,并且可以通过Java的`java -jar`命令来执行。在开发和维护Java项目时,经常需要查看JAR包内部的内容,尤其是类文件(....

    java 程序都编译成执行文件jar命令详解

    创建 JAR 文件主要通过 Java Development Kit(JDK)提供的 `jar` 命令。例如,若有一个名为 `test` 的目录,包含 `Test.class` 类文件,我们可以使用以下命令创建 JAR 文件: ```bash jar cvfm test.jar manifest....

    参考no.2用java -jar命令运行你的JARs.doc

    Java -jar 命令是Java开发中一个非常实用的功能,它允许开发者将Java应用程序打包成JAR(Java Archive)文件,便于分发和执行。本文主要探讨如何使用`java -jar`命令来运行JAR文件,特别是对于那些原本无法直接通过...

    JAR命令&JAR包详解.doc

    JAR命令提供了丰富的功能,能够满足开发者在处理Java应用程序打包和部署时的需求。通过对JAR命令的深入了解,开发者可以更加高效地管理Java项目的构建流程。此外,通过使用MANIFEST.MF文件,可以方便地管理JAR文件的...

    编译运行java带jar包

    一旦JAR文件创建完毕,我们可以通过`java`命令运行它,指定 `-jar` 选项和JAR文件的路径。如果MANIFEST.MF正确指定了主类,那么Java会自动执行它。例如: ```bash java -jar myapp.jar ``` 如果JAR文件依赖于...

Global site tag (gtag.js) - Google Analytics