【转】运行jar应用程序引用其他jar包的四种方法

Android Studio 引用系统 jar 包的正确姿势 阅读详情
大家都知道一个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加载前加载,注意使用,和系统类冲突就不好了.
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用空格隔开就可以了。注意使用相对路径。
 

需要注意的:

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

2. Manifest-Version、Main-Class和Class-Path后面跟着一个英文的冒号,冒号后面必须跟着一个空格,然后才是版本号、类和ClassPath。
3. Class-Path中的各项应使用空格分隔,不是逗号或分号。
4. Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写。注意:从第二行开始,必须以两个或两个以上空格开头
5. Class-Path写完之后最后一定要有一个空行。
6. jar包内有些配置文件想放在jar包外面,比如文件config.properties:如果这个文件是以路径方式载入的,比如new file("./config/config.properties"),那么将config.properties放在jar包相同目录下的config目录下即可,也就是说“./”路径等价于jar包所在目录;如果这个文件是以ClassPath下的文件这种方式载入的,比如在Spring中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与jar包放在同一个目录即可,当然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然后把配置文件都放在jar包相同目录下的config目录下。


 
方法四、自定义Classloader来加载
这种方法是终极解决方案,基本上那些知名java应用都是那么干的,如tomcat、jboss等等。
这种方式有点复杂,需要专门开贴讨论。关于ClassLoader的原理和自定义ClassLoader可以参考这篇  http://longdick.iteye.com/blog/442213。
 
 
总结:
以上四种方法都可以用,特别是程序运行在非常单纯的环境中时。但是,如果是运行在多任务,多应用的环境中时,最好每个应用都能相互独立,第一种和第二种方案都有可能对其他应用产生影响,因此最好就是选择第三种和第四种。
【java】java -jar/-cp启动添加外部的依赖包 然后分别讲一下这两种方式启动程序时,如何加载外部依赖的包。为了方便大家理解,首先说一下Java的ClassLoader。的具体作用就是将class文件加载到jvm虚拟机中去。我们都知道在Java中程序是运行在虚拟机中,我们平常用文本编辑器或者是IDE编写的程序都是.java格式的文件,这是最基础的源码,但这类文件是不能直接运行的。最顶层的加载类,主要加载核心类库,。另外需要注意的是可以通过启动jvm时指定。比如被指定的文件追加到默认的bootstrap路径中。 阅读详情

相关推荐

Windows10检查Cuda和cuDNN是否安装成功?

简介:根据上篇博客已经完成了CUDA和cuDNN的安装步骤,完成对其的安装。下面将来检查它们是否安装成功。 1 .首先win+R进入CMD,在命令行输入nvcc -V,如下图所示,则表示cuda已经安装成功。 2 .进入到cuda的安装路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite,找到如下两个.exe文件: 首先执行:deviceQuery.exe,查看是否出现如下界面: 然后执行bandwid

jhsignal的博客 14万+

java运行时加载jar包

Java运行时加载jar包

zhonghangliu的博客 3267

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

Java运行时加载外部Jar包(class文件)

URLClassLoader可以从指定的URL路径中加载类资源,而不局限于传统的类路径,这些URL可以是文件系统路径、网络路径或者JAR文件路径等。这意味着可以从远程服务器或者动态生成的路径加载类文件,实现动态加载类,从而实现插件化或者动态扩展的功能。// 定义URL数组,指定要加载的类路径// 创建URLClassLoader实例/**使用jar包方式加载*/// 使用URLClassLoader加载指定类Class<?// 实例化类对象。

sinat_39488150的博客 3789

3D点云处理:PointNet++与PointTransformer的对比

摘要: 3D点云处理中,PointNet++和PointTransformer是两种主流深度学习模型。PointNet++通过分层采样和分组策略提取局部特征,而PointTransformer利用自注意力机制捕捉全局上下文。实验表明,PointTransformer在分类(ModelNet40准确率92.1%)和分割(ShapeNet mIoU 85.7%)任务上性能更优,但计算开销较大(训练时间180秒/轮)。PointNet++在实时性场景更具优势(训练时间120秒/轮)。未来可结合两者优势,或优化Tr

shejizuopin的博客 1121

深入解析DDR5 SDRAM中的CA训练模式(CATM):原理与实现

本文深入解析DDR5 SDRAM中的CA训练模式(CATM),详细探讨其工作原理与实现方法。通过分析JESD79-5标准,揭示CATM在时序校准、信号质量优化和系统稳定性方面的核心价值,并提供硬件设计考量和系统级调试技巧,帮助工程师解决高速内存系统中的信号完整性问题。

weixin_29235923的博客 383

java项目中添加外部jar包的两种方式

找到放jar文件的位置,选中jar文件,,点击OK,,然后下一步一直到最后选择OK就可以了。例如执行上面的引入外部 ceshi-1.0.1-SNAPSHOT.jar 到本地仓库。artifactId:项目的名称(自定义,执行时写什么名,pom文件中也要对应写什么名)groupId:项目包名(自定义,执行时写什么名,pom文件中也要对应写什么名)version:版本号(自定义,执行时写什么名,pom文件中也要对应写什么名)2、选择Libraries--->点击+号-->选择Java。

SUMMERENT的博客 2万+

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

A20802013的博客 2万+

运行jar应用程序引用其他jar包的四种方法

大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。   具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。   比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName 我们就只要在MANIFEST.MF...

幸福的懦夫 1312

Claude Code 使用 OpenAI Codex(GPT-5.3-Codex)完整配置教程

通过 LiteLLM 可以让 Claude Code 调用任何模型,包括:OpenAIDeepSeekGemini本地模型↓↓优点:不依赖 Anthropic API可自由切换模型支持统一 AI Gateway这种“LLM Gateway 架构”正在成为 AI 开发工具的主流实践。

Jacobe_zhao的博客 1万+

Qt跨平台CAN通信实战:Vector、PCAN与周立功设备统一接口设计

本文针对Qt开发中常见的多品牌CAN设备兼容难题,提出了一套统一的跨平台CAN通信接口设计方案。通过抽象层封装,实现了对Vector、PCAN和周立功设备的统一操作,上层业务代码无需修改即可在不同硬件间切换,有效解决了驱动API差异、环境配置复杂和维护成本高等痛点,显著提升了代码复用率和开发效率。

weixin_29161785的博客 329

运行jar应用程序引用其他jar包的四种方法(转)

Runnable JAR RunnableJAR(1)在Eclipse中操作 上面的截图中eclipse的版本是: 方案二:安装Eclipse打包插件Fat Jar 方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐。这时可以使用一个打包的插件—Fat Jar。 Fat Jar Eclipse Plug-In是一个可以将Eclipse ...

weixin_33936401的博客 242

3、图像中文字信息提取技术全解析

本文全面解析了图像中文字信息提取(Text Information Extraction,TIE)的技术原理、挑战及应用领域。详细介绍了图像中三种主要文字形式:场景文字、字幕文字和文档文字的特点及提取难点。系统阐述了TIE技术的主要流程步骤,包括文字检测、定位、提取与增强、识别等关键阶段,并对主流技术方法进行了分类比较,包括基于连通组件、边缘、纹理等方法的优缺点分析。文章还介绍了多种其他提取技术,如二值化方法、混合方法、基于梯度的方法等,并提出了一种基于立体帧的新型场景文字提取方法,通过实验验证了该方法在召

ll5678的博客 119

运行jar包应用程序时引用其他的jar包的方法

大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。 具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。 比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName 我们就只要在MANIFEST.MF里面添加如下

2833

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用Maven 打Jar包, 运行时引用的外部Jar包报 ClassNotFoundException

1.放外部JAR包到项目中 2.pom.xml配置,注意:添加classpath缺少的内容,如果不添加,生成的JAR包的MANIFEST.MF文件中会缺少对应的引用。 <build> <plugins> <!-- java编译插件 --> <plugin> <g...

2989

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【java基础】运行jar应用程序引用其他jar包的四种方法

大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口。   具体的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。   比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName 我们就只要在MANIFEST.MF

youxia0075454的专栏 1160

运行jar包时,找不到引用的依赖包的解决方法

我收藏的文章 运行jar包找不到依赖包的解决方法 运行jar应用程序引用其他jar包的四种方法 JAR包中的MANIFEST.MF文件详解以及编写规范 解决办法1: 将第三方jar包放到JRE的扩展类文件夹中(%JAVA_HOME%/jre/lib/ext), 解决方法2: 修改jar包的MANIFEST.MF文件 详细如下: 通过不断地试验,终于成功了! 1、写好自己的MANIFEST.MF文件,放到项目中 2、新建文件夹test位于D盘; 3、将用到的所有第三方...

ftm_csdn的博客 1万+

linux运行jar包、查看jar包进程、停止jar包

要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下四种方式。 一、java -jar XXX.jar 这是最基本的jar包执行方式,但是当我们用ctrl+c中断或者关闭窗口时,程序也会中断执行。 二、java -jar XXX.jar &a...

过期罐头 2万+

linux如何运行jar包、查看jar包进程、停止jar包

linux运行jar包 要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下四种方式。 一、java -jar xxx.jar 这是最基本的jar包执行方式,但是当我们是当我们用ctrl+c中断或者关闭窗口时时,程序也会中断执行,当然关闭或重启虚拟机也同样如此。 二、java -jar xxx.jar & &代表在后台运行,使用ct

w_xiao_wang的博客 1万+

部署运行jar包方法全解docker镜像打包部署等

argN 则是该命令的参数。如果没有指定日志输出到特定的文件中,而是使用默认的行为,则在运行 nohup 命令时生成的 nohup.out 文件中包含了输出信息和错误信息。如果将日志输出重定向到指定的日志文件(如 ./XXXX.log),那么日志文件将会在指定的路径中生成。创建一个dockerfile的配置文件,这个很重要再次强调这个文件一定是要在你的文件路径下的,和你的jar包位置在一起。有一种叫做“nohup”的命令,该命令可以让您的应用程序在后台运行,即使您已经断开了与终端的连接也能保持运行状态。

阿丹的博客 1万+

java 引用 jar包_java命令行引用jar包的方法

java命令行引用jar包的方法java命令行怎么引用jar包?jar包有哪些常用方法?下面跟yjbys小编一起来学习一下,希望对大家学习java语言有帮助!一般情况下:如果java 文件和jar 包在同一目录编译:D:\wangyu>javac -cp xalan.jar Test.java执行:D:\wangyu>java -classpath xalan.jar; Test如果j...

weixin_36090220的博客 5374
上一篇: IE8 Session 混乱问题的解决方案
下一篇: POI设置EXCEL单元格的"条件格式"
JustForFly
博客等级 码龄20年 18粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值