搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
运维做开发
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
前端面试准备——day06
2
arduino 步进电机驱动库_STM32F103定时器PWM驱动步进电机加减速
3
动手实践虚拟网络 - 每天5分钟玩转 OpenStack(10)_openstack底层如何查看虚拟机虚拟网卡配置
4
App已损坏你应该将它移到废纸篓解决方案_“app uninstaller”已损坏,无法打开。 您应该将它移到废纸篓。
5
毕业论文——校园网规划与建设_校园网综合布线系统设计方案论文
6
玩客云nas基础玩法、Armbian、CasaOS+Alist+aria2下载_casaos下载
7
python中表示次方_python中的n+1问题
8
GPT4o“全能”模型发布;2人AI团队被收购;3款AI搜索引擎_搜索gpt4o
9
基于python的上市公司年报新闻文本分类_python 上市公司新闻公告
10
机器学习-支持向量机_支持向量机svm
当前位置:
article
> 正文
在可执行jar中动态载入第三方jar_在已有的jar包中引入第三方jar包
作者:运维做开发 | 2024-06-29 21:16:26
赞
踩
在已有的jar包中引入第三方jar包
一、前言
在商业化开发中经常是将开发的类打成jar包发布.由于有很多第三方的提供功能集合Jar 包,所以经常会用到这些功能包.以下情景是很多Java开发人员经常碰到的:在开发,调试阶段,通过在CLASSPATH中设置第三方的jar包路径,自 己编写的class工作正常.开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)来动态载入存在于第三方jar包中的class会抛出异常” ClassNotFoundException.
这种问题存在于通过jar –jar yourself.jar 来运行jar包,并在jar中的class中通过Class.forName(String classname)来动态载入第三方的class的时候.
常见的应用,比如根据用户的选择配置,动态载入不同厂商的JDBC Driver.
二、背景知识
自JDK 1.2以后,JVM采用了委托(delegate)模式来载入class.采用这种设计的原因可以参考
http://java.sun.com/docs/books/tutorial/ext/basics/load.html
归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机制.
三、Java虚拟机(JVM)寻找Class的顺序
3.1 Bootstrap classes
属于Java 平台核心的class,比如java.lang.String等.及rt.jar等重要的核心级别的class.这是由JVM Bootstrap class loader来载入的.一般是放置在{java_home}/jre/lib目录下
3.2 Extension classes
基于Java扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放置在{Java_home}/jre/lib/ext目录下
3.3 User classes
开 发人员或其他第三方开发的Java程序包.通过命令行的-classpath或-cp,或者通过设置CLASSPATH环境变量来引用.JVM通过放置在 {java_home}/lib/tools.jar 来寻找和调用用户级的class.常用的javac也是通过调用tools.jar来寻找用户制定的编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.
3.3.1 缺省值:调用Java或javaw的当前路径(.),是开发的class所存在的当前目录
3.3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值
3.3.3 执行Java的命令行-classpath或-cp的值,如果制定了这两个命令行参数之一,它的值会覆盖环境变量CLASSPATH的值
3.3.4 -jar 选项:如果通过java –jar 来运行一个可执行的jar包,这当前jar包会覆盖上面所有的值.换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略.JVM APPClassloader将只会以jar包为搜索范围.有关可执行jar有许多相关的安全方面的描述,可以参考
http://java.sun.com/docs/books/tutorial/jar/
来全面了解.
这也是为什么应用程序打包成可执行的jar包后,不能引用第三方jar包的原因.
四、解决方案.
首先我们简要归纳一下,为了方便理解,简化一下上面描述的架构,
Java定义了三种级别的class,分别为BootStrap class,Extend Class,User class.
其中User class限制规则最复杂.在User class中可执行的jar包,更包含独立安全规则.所以解决方案基于Java三种不同级别的class扩展机制,有三种不同的方案.
4.1 BootStrap class扩展方案
Java 命令行提供了如何扩展bootStrap 级别class的简单方法.
-Xbootclasspath:基本核心的Java class 搜索路径.不常用,否则要重新写所有Java 核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面.常用.
-Xbootclasspath/p:前缀在核心class搜索路径前面.不常用,避免引起不必要的冲突.
语法如下:
java –Xbootclasspath/a:/path/myclass/account.jar: -jar yourself.jar(Unix用:号隔开)
java –Xbootclasspath:/d:/myclass/account.jar; -jar yourself.jar(Window用;号隔开)
4.2 extend class 扩展方案
Java exten class 存放在{Java_home}/jre/lib/ext 目录下.当调用Java时,对扩展class路径的搜索是自动的.总会搜索的.这样,解决的方案就很简单了,将所有要使用的第三方的jar包都复制到ext 目录下.
4.3 User class扩展方案
当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.步骤如下
1.将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下.
比如:jar 包在 d:/crm/luncher.jar 那么你可以把所有jar包复制到d:/crm目录下或d:/crm/lib 子目录下.
2.修改Manifest 文件
在Manifest.mf文件里加入如下行
Class-Path:classes12.jar lib/class12.jar
Class-Path 是可执行jar包运行依赖的关键词.详细内容可以参考
http://java.sun.com/docs/books/tutorial/ext/index.html
另外编写自己的ClassLoader,来动态载入class,是更加复杂和高级技术.限于篇幅,不赘述.有兴趣了解可以去google一下custom classloader
4.4 推荐方案 4.1,扩展性非常好.
五、总结
Java的安全机制随不同的JDK版本有不同的变化,会影响很多核心CLASS,比如Thread,所以很多大型商业软件,要求JDK的版本很严格.部分原因也在此.这也要求在发布自己编写的应用时候,不管大小,都要说明开发和测试的JDK版本.
本文所测试基于jdk 1.4.1_03 for windows
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
【wpsshop博客】
推荐阅读
article
Linux
输入
“
su
”进入
root
时,提示“认证失败”的
解决办法
_
su
: 认证失败...
其原因是:没有设置
root
的密码,安装时设置的是用户密码,当使用
su
do进入
root
时只需要
输入
用户密码,而使用
su
进入...
赞
踩
article
vue2
.0
解决
跨域
问题
,
vue3
.0
解决
跨域
问题_
vue2
代理不会
跨域
vue3
会...
首先我简单的谈谈自己对
跨域
的一个理解:简单的来说就是当前的网址和你需要请求数据的网址不一样
,
具体怎么不一样
,
可以概括为几...
赞
踩
article
LLM
漫谈(三)| 使用
Chainlit
和
LangChain
构建文档问答
的
LLM
应用程序
...
Chainlit
是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)
应用程序
的
方式。
Chainlit
可以创建...
赞
踩
article
华为OD机试题:
字符串
变换
最
小
字符串
_给定一个
字符串
s
,
最
多只能
进行
一次
变换
...
题目描述:给定一个
字符串
s
,
最
多只能
进行
一次
变换
,返回
变换
后能得到的
最
小
字符串
(按照字典序
进行
比较)。
变换
规则:交换字符...
赞
踩
article
GIT命令(急速
学习
),
java
微信小程序开发教程_
git
staged
changes
...
虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不...
赞
踩
article
推荐开源
项目
:
F
-
Droid
客户端
...
推荐开源
项目
:
F
-
Droid
客户端
项目
地址:https://gitcode.com/f-droid/fdroidcli...
赞
踩
article
Linux
密码
定期
更换
时间配置_
linux
密码
更换
周期...
Linux
密码
定期
更换
时间配置的一些注意事项。_
linux
密码
更换
周期
linux
密码
更换
周期 ...
赞
踩
article
走出大
模型
部署
新手村!小明这样
用
魔
搭
×
函数
计算
_
魔
搭
上的数据集下载后怎么
用
...
前文介绍了
魔
搭
ModelScope 社区
模型
服务 SwingDeploy 服务。开发者可以将
模型
从
魔
搭
社区的
模型
库一键...
赞
踩
article
开源RAG
,
本地
mac
启动
dify
源码
服务
_
dify
开发
本地
启动
...
参考官方文档来操作
,
基本没太大的问题。一些细节
,
我在本篇文章中补充了出来。这篇文章主要讲以
源码
的方式
启动
后端
服务
,
前端服...
赞
踩
article
cn
.
hutool
.poi.
excel
.
ExcelUtil
时不时
没有
数据
列_
excel
util导出...
代码List
list = reportWleSaleService.wleUserSal...
赞
踩
article
25个
网络
安全
等
级
保护
相关文件、指南、
要求
等
(文末附PDF)!_
网络
等
级
保护
pdf
...
等
保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分
等
级
实行安全
保护
...
赞
踩
article
pandas
导出
Excel
表格
,
银行卡号、
身份证号
无法正常显示
的
问题
,
该怎么解决?......
这个
问题
已经被人问了不下五遍了
,
可见这样
的
问题
,
也是大家在工作中经常碰到
的
。所以不管怎么样子
,
我今天找出了一种方法
,
解...
赞
踩
article
Python
语言开发学习之
使用
Python
预测
天气
_
python
天气
预测
算法...
使用
Python
预测
天气
的第一步,我们要了解wttr是什么。wttr.in是一个面向控制台的
天气
预报服务,它支持各种信息...
赞
踩
article
安卓
市场
的
“
安全
评估
报告
”攻略_
安卓
市场
的
安全
评估
报告
略...
近日,有开发者向七麦反映,自己收到了一些
安卓
应用
市场
的
邮件,称需要为自家产品上交一份《
安全
评估
报告
》,但开发者却不知道该...
赞
踩
article
Streamlit
搭建
聊天
机器人
(一)_
streamlit
聊天
...
【代码】
Streamlit
搭建
聊天
机器人
(一)_
streamlit
聊天
streamlit
聊天
...
赞
踩
article
AI
产业链
的划分,主要可
分为
基础
层
、
技术
层
和
应用
层
_
应用
层
、
技术
层
...
基础
层
,基础
层
又
分为
数据
层
和计算能力,数据
层
像自身能够不断产生数据的Alphago一样,他会自己不断的产生数据和进化它的...
赞
踩
article
Linux
搭建
我
的世界MC
服务器
【
Minecraft
外网联机教程】_
linux
架设
mc
_
mc
服务器
...
最近很多小伙伴找
我
要
Linux
学习资料,于是
我
翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!_
mc
...
赞
踩
article
云计算
学习
线路
_
学习
云...
参考:https://www.jianshu.com/p/c8382065bd2b
_
学习
云
学习
云 ...
赞
踩
article
数据结构
——
顺序
表
和
链
表
_
顺序
链
表
...
数据结构
的
顺序
表
和
链
表
_
顺序
链
表
顺序
链
表
目录 一、线性
表
二、
顺序
表
1、
顺序
表
的定义...
赞
踩
article
CrossOver
对
mac
电脑的危害
CrossOver
23
激活码 parallels对
mac
的损害...
双系统因为占用内存较大,常被用户摒弃,虚拟机则成了更多人的选择。有些用户想要在
Mac
上运行
Windows
或者Linux等...
赞
踩
相关标签
linux
服务器
运维
vue
javascript
langchain
chatgpt
语言模型
leetcode
算法
python
git
学习
java
ubuntu
网络安全
云计算
云原生
阿里云
dify
源码启动
web安全
pdf
网络