- 浏览: 56634 次
- 性别:
- 来自: 杭州
-
最新评论
一般以下两种情况会触发sealing安全异常
1)当被密封(seal)的package已经被加载,此时再试图去加载其他jar中的同名package,就会触发sealing violation异常
2)当没有被密封的package已经被加载,此时再去加载其他jar中同名且被密封的package,也会触发sealing violation异常
假设某次发布的jar(v1.jar)中包含NumerUtils和StringUtils这俩工具类
一段时间后,需要对该v1.jar进行升级,加入一个新的工具类DateUtils.java
同样的,采用上面的步骤进行编译、打包得到v2.jar
1)当被密封(seal)的package已经被加载,此时再试图去加载其他jar中的同名package,就会触发sealing violation异常
2)当没有被密封的package已经被加载,此时再去加载其他jar中同名且被密封的package,也会触发sealing violation异常
假设某次发布的jar(v1.jar)中包含NumerUtils和StringUtils这俩工具类
package com.seal.util; import java.text.DecimalFormat; public class NumberUtils { public static String format(double d) { return new DecimalFormat("#,##0.00").format(d); } }
package com.seal.util; public class StringUtils { public static String format(String str) { return "Format:" + str; } }
/** javac -d v1 NumberUtils.java StringUtils.java 编译源文件至v1目录,多个源文件用空格分隔 jar -cvfm v1.jar mf.mf -C v1 . 将v1目录下的所有子目录和文件都压缩成jar文件, jar文件的MANIFEST.MF采用自己定义的mf.mf mf.mf内容如下: Manifest-Version: 1.0 Created-By: 1.6.0_33 (Sun Microsystems Inc.) Name: com/seal/util/ Sealed: true */
一段时间后,需要对该v1.jar进行升级,加入一个新的工具类DateUtils.java
同样的,采用上面的步骤进行编译、打包得到v2.jar
package com.seal.util; import java.util.Date; import java.text.SimpleDateFormat; public class DateUtils { public static String format(Date date) { return new SimpleDateFormat("yyyy-MM-dd").format(date); } }
import com.seal.util.NumberUtils; import com.seal.util.StringUtils; import com.seal.util.DateUtils; public class MainTest { public static void main(String[] args) { System.out.println(NumberUtils.format(1.2)); System.out.println(StringUtils.format("str")); System.out.println(DateUtils.format(new java.util.Date())); } }
/** javac -cp v1.jar;v2.jar MainTest.java 编译MainTest源文件 java -cp .;v1.jar;v2.jar MainTest 运行MainTest 此时classpath同时包含v1.jar跟v2.jar 因为jvm加载package的顺序是根据jar在classpath出现的先后顺便来进行的,所以此时先从v1.jar加载了seal的com.seal.util,但是DateUtils需要从v2.jar获得,所以就会触发sealing violation安全异常 Exception in thread "main" java.lang.SecurityException: sealing violation: packa ge com.seal.util is sealed at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at MainTest.main(MainTest.java:10) 相反的,如果一开始加载的v1的package不是seal的,要从v2加载seal的同名package就会触发另一个sealing violation安全异常 Exception in thread "main" java.lang.SecurityException: sealing violation: can't seal package com.seal.util: already loaded at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at MainTest.main(MainTest.java:10) */
发表评论
-
redis安装(windows.exe)
2014-05-21 22:54 754https://github.com/rgl/redis ... -
rabbitMQ安装(windows下)
2014-05-21 22:41 699进入项目下载主页面http://www.rabbitmq.co ... -
实现单线程的断点下载
2014-04-16 09:43 863/** * 实现单线程的断点下载 */ publ ... -
实现一个简易的http模拟器
2014-04-15 15:20 1837/** * http模拟器 * 模拟发送http请求和 ... -
xml学习鉴定
2014-04-09 23:33 862实现招生录取系统中的 ... -
xml学习
2014-04-08 22:47 1494XML:Extensible Markup Langu ... -
HTTP断点续传
2014-03-31 22:13 821http://fenglingcorp.iteye.com/b ... -
java多线程-线程状态转换
2014-03-01 09:20 8181. 新建(new):新创建了一个线程对象。 2. 可 ... -
apt处理自定义annotation
2014-02-19 23:20 1054package annotations; import ... -
跳过UTF-8的BOM
2014-02-14 12:19 1528/** version: 1.1 / 2007-01-25 ... -
java reference
2014-02-09 00:36 698import java.lang.ref.PhantomR ... -
不带头结点的单链表面试汇总
2014-01-24 13:47 1522import java.io.ByteArrayInputSt ... -
带头节点的单链表面试题汇总
2014-01-23 15:12 1047import java.io.ByteArrayInput ... -
单链表面试题之-链表反转
2014-01-15 22:43 1122单链表反转 -------------------- ... -
java单链表-带头结点和不带头结点单链表的简单实现
2014-01-14 23:41 4944带头结点的单链表实现 public class LinkedL ... -
ClassLoader
2013-11-08 15:57 939public class ClassLoaderTest { ... -
URL和URI
2013-11-08 13:48 551private static void getData ... -
i++和++i
2013-11-06 15:26 542// i = i++ 计算过程 // temp = i; ... -
java 继承 多态
2013-11-06 15:19 831/** 运行结果: A's constructor co ... -
hashmap分析
2013-10-30 15:20 711/** hashmap底层维护着一个entry数组,每 ...
评论