大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。
具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。
比如有个叫做test.jar的jar包,里面有一个拥有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加载前加载,注意使用,和系统类冲突就不好了.
方法二、使用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
总结:
以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。
相关推荐
### 二、执行Java命令引入外部JAR包的方法 #### 方法1:修改系统环境变量 最常见的方式是通过修改系统环境变量`CLASSPATH`来添加外部JAR包。`CLASSPATH`环境变量告诉JVM在哪里可以找到用户自定义的类和资源。例如...
Java 命令执行 JAR 包的多种方法 Java 命令执行 JAR 包是一种常见的应用场景,在实际开发中,我们经常需要执行 JAR 包文件。那么,如何使用 Java 命令执行 JAR 包呢?本文将为大家介绍四种不同的方法,每种方法都有...
Java 配置数据库 Jar 包操作 Java 配置数据库 Jar 包操作是指在 Java 项目中将 MySQL 数据库的 Jar 包导入到项目中,以便使用 JDBC 连接数据库的操作。下面是关于 Java 配置数据库 Jar 包操作的详细知识点: 什么...
4. **运行JAR包** 一旦JAR文件创建完毕,我们可以通过`java`命令运行它,指定 `-jar` 选项和JAR文件的路径。如果MANIFEST.MF正确指定了主类,那么Java会自动执行它。例如: ```bash java -jar myapp.jar ``` ...
通过阅读这个文件,开发者可以了解到如何创建规则文件,设置各种指令,以及如何运行jarjar命令。这对于初学者来说是快速上手的关键。 使用jarjar的基本步骤包括: 1. **编写规则文件**:规则文件是一个XML或文本...
根据提供的信息,本文将详细介绍如何通过不同方式将Java程序打包成可执行的JAR文件。 #### 使用`jar`命令手动打包 1. **准备工作**:首先确保所有的`.class`文件位于同一个目录下,例如`D:/chat/`。 2. **创建...
Java通用jar包是一种在Java开发中广泛使用的可重用代码库,它包含了预编译的类和资源,便于开发者在自己的项目中导入和使用。jar(Java Archive)是Java平台的标准打包格式,允许将多个Java类文件和其他资源文件集合...
**运行JAR文件** 创建完可执行的JAR文件后,可以通过以下命令运行: ```bash java -jar YourJar.jar ``` 注意,如果JAR包含外部依赖,需要确保类路径设置正确,或者使用包含依赖的JAR方式运行。 总的来说,将Java...
最终,生成JAR包后,可以通过Java命令来运行JAR文件。假设清单文件中定义了主类,可以简单地使用命令:`java -jar Crazyit.jar`来运行程序。 此外,一个完整的Java开发环境还可能涉及到其他构建工具,例如Maven或...
1. 运行JAR:通过`java -jar jar_file_name`命令运行已指定主类的JAR文件。 2. 导入JAR:在Java项目中,可以通过`<classpath>`元素在构建路径中添加JAR,或者使用`Class.forName()`和`ClassLoader`来动态加载JAR中的...
以下是对“JAVA打成jar包”这一主题的详细解析。 1. **JAR文件结构**: - **MANIFEST.MF**:每个JAR文件都包含一个清单文件,它定义了入口点(启动应用的主类)和其他重要属性。 - **Class Files**:Java源代码...
### JAR命令与JAR包详解 #### 一、JAR包概述 JAR(Java ARchive)包是Java平台特有的一种压缩文件格式,主要用于将多个Java类文件和其他资源文件打包成一个单独的文件。它类似于常见的ZIP格式,但具有更高级的功能...
Java的JAR(Java Archive)文件是Java平台特有的打包格式,用于集合多个类文件、资源文件等,并且可以通过Java的`java -jar`命令来执行。在开发和维护Java项目时,经常需要查看JAR包内部的内容,尤其是类文件(....
JAR(Java Archive)是 Java 开发工具包 (JDK) 中的一个实用程序,用于将多个 Java 类文件和其他资源文件打包成一个 JAR 文件。JAR 文件不仅便于分发和部署,还支持对文件进行压缩,减少文件大小。 #### 二、JAR ...
### Java 编译 Jar 包知识点...通过上述分析可以看出,`jar`命令提供了非常灵活的方式来创建、管理Jar文件,这对于Java开发者来说是一项非常实用的技能。了解并掌握这些命令的使用方法对于提高开发效率具有重要意义。
下面将详细阐述Java开发中JAR包的用途、创建、使用以及常见的一些jar包类型。 1. **JAR文件的用途**: - **代码打包**:将多个`.class`文件打包成一个JAR文件,便于分发和运行。 - **资源整合**:除了包含类文件...
在Java项目中使用Kettle时,通常需要将Kettle的相关库(jar包)引入到项目的构建路径中。然而,有时我们可能无法直接从Maven仓库获取这些依赖,这时就需要手动处理。 首先,让我们来看看`pom.xml`文件的作用。在...
8. **批处理文件运行JAR**:为了方便运行JAR包,可以创建一个批处理文件(.bat文件),其中包含运行JAR包所需的命令和参数,例如: ```batch @echo off rem Set BQ_IBS_HOME before running this script. rem if...
打包完成后,可以通过命令行使用`java -jar jarfile.jar`命令来运行JAR文件。如果在MANIFEST.MF中指定了主类,Java虚拟机会自动加载并执行。 8. **注意事项**: - 确保所有依赖的库都被包含在JAR文件中,或者在...
运行jar文件时,Java虚拟机(JVM)会加载并执行其中的主类,这个主类通常由manifest文件指定,manifest文件是一个包含元数据的小文本文件,它告诉JVM哪个类应该作为程序的入口点。 描述中提到的“Demo中包括工程的...