`
xinklabi
  • 浏览: 1587726 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题)

    博客分类:
  • Java
 
阅读更多

java命令执行jar包的方式

大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。

 

具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。

 

比如有个叫做test.jarjar包,里面有一个拥有main函数的main class:test.someClassName

我们就只要在MANIFEST.MF里面添加如下一句话:

Main-Class: test.someClassName

 

然后我们可以在控制台里输入java -jar test.jar即可以运行这个jar

 

但是我们这个项目需要引用其他第三方的jar包,在eclipse里面以项目jar包的形式引用了这个叫做some.jar的包,当时放在项目的lib子目录下,最后项目打包时把这个some.jar也打进来了,但是用java -jar执行这个test.jar的时候报找不到Class异常,原因就是jar引用不到放在自己内部的jar包。

 

那怎么办?

 

运行时将其加入classpath的方式行不行?就是在运行jar的同时加入classpath参数:

java -classpath some.jar -jar test.jar

 

这种方式是不行的,因为使用classpath指定的jar是由AppClassloader来加载,java 命令 加了-jar 参数以后,AppClassloader就只关注test.jar范围内的class了,classpath参数失效。

 

那该怎么引用其他的jar包呢?

 

方法一、使用Bootstrap Classloader来加载这些类

 

我们可以在运行时使用如下参数:

 

 

-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.

win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
unix    java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开

 

 

 

方法二、使用Extension Classloader来加载

 

你可以把需要加载的jar都扔到%JRE_HOME%/lib/ext下面,这个目录下的jar包会在Bootstrap Classloader工作完后由Extension Classloader来加载。非常方便,非常省心。:)

 

 

 

方法三、还是用AppClassloader来加载,不过不需要classpath参数了

 

我们在MANIFEST.MF中添加如下代码:

Class-Path: lib/some.jar

 

lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。

然后测试运行,一切正常!

 

如果有多个jar包需要引用的情况:

Class-Path: lib/some.jar lib/some2.jar

每个单独的jar用空格隔开就可以了。注意使用相对路径。

 

另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。

 

 

方法四、自定义Classloader来加载

这种方法是终极解决方案,基本上那些知名java应用都是那么干的,如tomcat、jboss等等。

这种方式有点复杂,需要专门开贴讨论。关于ClassLoader的原理和自定义ClassLoader可以参考这篇http://cuixiaodong214.blog.163.com/blog/static/951639820099135859761

 

总结:

以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。

 

 

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

 

如果单个jar文件,没有引用到其他jar文件,而且指定了Main-Class,可以这样运行:
    java -jar hello.jar
如果执行的jar文件引用了其他jar文件,该怎么办?
这里hello.jar里面用到Log4j的Log
    java -cp log4j-1.2.14.jar -jar hello.jar
这个想当然可以执行,实际上执行会出现ClassNotFoundException的
因为使用了 -jar 选项,环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略

正确运行方式如下:
    1、
    java -cp lib\log4j-1.2.14.jar;hello.jar com.dhn.Hello    (com.dhn.Hello为主类)
    在windows下多个jar之间以分号(;)隔开,最后还需要指定运行jar文件中的完整的主类名
    2、
    java -jar hello.jar
    但是需要修改hello.jar中的MANIFEST.MF,通过MANIFEST.MF中的Class-Path 来指定运行时需要用到的其他jar,
    其他jar可以是当前路径也可以是当前路径下的子目录。多个jar文件之间以空格隔开
    以下面的MANIFEST.MF文件为例
    Manifest-Version: 1.0
    Main-Class: com.ibm.portalnews.entrance.Main
    Class-Path: lib\commons-collections-3.2.jar lib\commons-configuration-1.5.jar lib\commons-lang-2.3.jar lib\commons-logging.jar lib\dom4j-1.6.1.jar lib\jaxen-1.1-beta-7.jar lib\jdom.jar lib\log4j-1.2.14.jar

    其中Manifest-Version表示版本号,一般由IDE工具(如eclipse)自动生成
    Main-Class 是jar文件的主类,程序的入口
    Class-Path 指定需要的jar,多个jar必须要在一行上,多个jar之间以空格隔开,如果引用的jar在当前目录的子目录下,windows下使用\来分割,linux下用/分割
    文件的冒号后面必须要空一个空格,否则会出错
    文件的最后一行必须是一个回车换行符,否则也会出错

分享到:
评论
1 楼 u012236967 2017-03-15  
 

相关推荐

    bat 运行java main方法

    2. 输入以下命令行,将`your-jar-file.jar`替换为你的实际`jar`文件名,`your-class-name`替换为包含`main`方法的类全名(包括包名): ``` @echo off java -jar your-jar-file.jar your-class-name ``` 3. 保存...

    Linux上执行带main方法的java文件

    这里需要注意的是命令中的`-jar`选项,它告诉Java运行时环境去读取该文件的`manifest.mf`文件,并从中找出`Main-Class`,然后执行该类的`main`方法。 #### 总结 通过上述步骤,可以在Linux环境下顺利地执行含有`...

    浅谈java 执行jar包中的main方法

    首先,当JAR文件包含了`MANIFEST.MF`文件,并且在这个文件中指定了`Main-Class`属性,那么默认情况下,使用`java -jar`命令执行JAR时,JVM会找到并运行`MANIFEST.MF`中指定的那个`main`方法。例如,`Main-Class: ...

    OpenCV运行环境(包含jar包和dll依赖)

    在Java项目中使用OpenCV时,需要确保正确的运行环境已经配置,包括必要的JAR包和DLL依赖。这里提到的是OpenCV的343版本,经过测试,它在处理图片亮度和色偏检测方面表现准确。 1. **OpenCV的Java接口**: OpenCV...

    TERADATA 连接JAVA所需jar

    标题提到的"TERADATA 连接JAVA所需jar"正是指这些驱动程序的Java归档文件(JAR),它们允许Java应用程序通过JDBC(Java Database Connectivity)接口与Teradata数据库通信。以下是关于这些JAR文件的详细解释: 1. *...

    用反射解析jar文件并执行里面Java代码

    这些文件被组织成一个类似于文件系统的目录结构,其中每个类文件包含Java类的字节码。 要解析jar文件,我们需要使用Java的`java.util.jar`包中的`JarFile`类。这个类提供了打开jar文件、获取jar manifest信息、以及...

    mysql-connector-java-8.0.28 jar包

    总的来说,MySQL Connector/J 8.0.28 jar包对于Java开发者来说是一个必不可少的工具,它使得Java应用能够高效、安全地与MySQL数据库进行通信,是构建基于Java的MySQL数据库应用的基础组件。无论是小型项目还是大型...

    Qt on Android调用Jar包

    【Qt on Android调用Jar包】是一个重要的技术实践,它涉及到跨平台开发和Java与C++的交互。在Android平台上,Qt提供了一种强大的方式来创建原生应用程序,但有时我们可能需要集成已经存在的Java库(以.jar文件形式)...

    java读取Word文档依赖jar包

    要开始使用Apache POI,你需要在你的Java项目中添加这些jar包作为项目的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.poi <artifactId>poi <version>4.1.2...

    Java调用Python的jar包

    在Java世界里,jar包是一种可执行的二进制文件,包含了编译后的类文件和其他资源。而描述中的"不好找"可能指的是寻找合适的库或者解决方案来完成这个任务的难度。 首先,我们需要了解Java如何调用外部程序,这通常...

    java 通过poi操作excel jar包

    标题中的"java通过poi操作excel jar包"指的是使用Apache POI库来处理Excel文件的Java程序,通常需要引入特定版本的POI JAR包。在这个案例中,我们有两个版本的JAR包可供使用:poi_3.17.jar和poi_3.15.jar。这些版本...

    Mysql 个版本jar 包

    在Java项目中,添加MySQL jar包的过程通常包括以下步骤: 1. **获取jar包**:你可以从MySQL的官方网站或者第三方库管理工具如Maven Central仓库下载不同版本的`mysql-connector-java`。文件名通常为`mysql-...

    java调用dll必备jar包

    本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的调用,因为它是一个跨平台的语言,而DLL是Windows操作系统特有的。为了实现Java与DLL之间的交互,我们需要借助于第三方库。在...

    sql2000 java三个jar包

    SQL Server 2000是微软推出的一款关系型数据库管理系统,它提供了多种方式与应用程序进行交互,其中就包括通过Java API。在Java项目中,为了实现Java应用程序与SQL Server 2000的通信,我们需要导入特定的JDBC驱动库...

    informix数据库连接驱动jar包

    这些jar文件包含了必要的类和资源,使得Java程序能够利用JDBC(Java Database Connectivity)API来执行SQL语句、管理数据库会话以及处理数据。在本讨论中,我们将深入探讨每个jar文件的作用以及它们在构建Informix...

    Shell执行/调用Java/Jar程序例子

    如果JAR文件依赖于其他库,可能需要设置`JAVA_OPTS`或`CLASSPATH`环境变量来包含这些库的路径。例如: ```bash export JAVA_OPTS="-classpath /path/to/dependency1.jar:/path/to/dependency2.jar" java -jar ...

    自动打包.java文件成.jar的小程序(C++)

    Java编程语言以其跨平台性和丰富的库支持而广受欢迎,但为了在不同的系统上运行Java程序,我们需要将编译后的.class文件打包成一个可执行的JAR(Java Archive)文件。本篇文章将详细介绍如何使用C++编写一个小程序来...

    base64encoder jar包

    在Java标准库中,虽然已经包含了`java.util.Base64`类来执行这些操作,但在一些较旧的项目或者不兼容新版本Java的情况下,这个独立的Base64Encoder.jar可能会更加适用。 Base64是一种在网络上传输二进制数据时常用...

    xpath的jar包

    XPath的jar包,例如`jaxen`,是Java实现的一个XPath处理库,它允许Java应用程序执行XPath查询并在XML文档中提取数据。Jaxen项目是一个开源项目,旨在提供一个独立于特定XML API的通用XPath引擎,支持DOM、DOM4J、...

Global site tag (gtag.js) - Google Analytics