java包装_Java罐密封包装

java包装

Java JAR provides option to seal the package. Java jar seal package means that if any program is using that jar then all the classes should be loaded from that jar itself. Any attempt to load the classes from other jar files will throw java.lang.SecurityException. The documentation for sealing jar packages seems confusing, so we will learn this feature with sample programs.

Java JAR提供了密封包装的选项。 Java jar密封包意味着,如果任何程序正在使用该jar,则应从该jar本身加载所有类。 从其他jar文件加载类的任何尝试都会抛出java.lang.SecurityException 。 密封罐包装的文档似乎令人困惑,因此我们将通过示例程序学习此功能。

Java罐密封包装 (Java jar seal packages)

For effect of jar package sealing, we need at least two jar files to use in a test program. Below image shows two java project I have with same package names but with different classes.

为了使罐包装密封,在测试程序中至少需要两个罐文件。 下图显示了两个Java项目,它们具有相同的程序包名称,但具有不同的类。

Read following posts to know how to create jar from java classes and how to run jar file in java.

阅读以下文章,以了解如何从Java类创建jar以及如何在Java中运行jar文件

For sealing packages in a jar, we need to add it’s entries in jar manifest file. So I have the manifest file with following content.

为了将包装密封在罐中,我们需要在罐清单文件中添加其条目。 因此,我具有以下内容的清单文件。

manifest.txt

manifest.txt

Name: com.jd.seal
Sealed: true

Now I run following commands in both projects to generate two jar files with above manifest entry.

现在,我在两个项目中都运行以下命令,以生成具有上述清单条目的两个jar文件。

pankaj@JD:~/CODE/seal1/bin$ jar cvmf manifest.txt seal1.jar com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/jd/(in = 0) (out= 0)(stored 0%)
adding: com/jd/seal/(in = 0) (out= 0)(stored 0%)
adding: com/jd/seal/A.class(in = 419) (out= 299)(deflated 28%)
pankaj@JD:~/CODE/seal1/bin$ cd ../../seal2/bin
pankaj@JD:~/CODE/seal2/bin$ jar cvmf manifest.txt seal2.jar com
added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/jd/(in = 0) (out= 0)(stored 0%)
adding: com/jd/seal/(in = 0) (out= 0)(stored 0%)
adding: com/jd/seal/B.class(in = 419) (out= 299)(deflated 28%)

Java jar密封包效果 (Java jar seal packages effect)

Now I will write a sample program that will use both these jar files to show the effect of java jar sealing.

现在,我将编写一个示例程序,将使用这两个jar文件来显示Java jar密封的效果。

import com.jd.seal.A;
import com.jd.seal.B;

public class MyClass{

	public static void main(String args[]){
	
		A a = new A();
		B b = new B();
	
	}
}

So MyClass is trying to load class A from jar file seal1.jar and class B from seal2.jar. Let’s try to compile and run this class and see what happens.

因此, MyClass尝试从jar文件seal1.jar加载类A,并从seal2.jar加载类B。 让我们尝试编译并运行该类,看看会发生什么。

pankaj@JD:~/tmp$ javac -cp seal1.jar:seal2.jar MyClass.java 
pankaj@JD:~/tmp$ java -cp seal1.jar:seal2.jar:. MyClass
A class loaded
Exception in thread "main" java.lang.SecurityException: sealing violation: package com.jd.seal is sealed
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:234)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at MyClass.main(MyClass.java:9)

As you can see that it throws java.lang.SecurityException at runtime with error message as “package is sealed“.

如您所见,它在运行时抛出java.lang.SecurityException ,并带有错误消息,如“ package sealed ”。

Jar package sealing helps us in making sure that all the classes are loaded from same version of jar file.

Jar包密封有助于我们确保从同一版本的jar文件中加载所有类。

Tip: If you want all the packages of a jar file to be sealed, you can just add entry for Sealed as true. To exclude any package from sealing, you can add an extra entry with Sealed as false.

提示 :如果要密封jar文件的所有软件包,则只​​需将Sealed的条目添加为true。 要从密封中排除任何包装,您可以添加额外的条目,将Sealed设置为false。

MANIFEST.MF

MANIFEST.MF

Sealed: true

Name: com.jd.util
Sealed: false

That’s all about java jar sealing packages.

这就是关于Java jar密封包的全部内容。

Reference: Oracle Doc

参考: Oracle文档

翻译自: https://www.journaldev.com/1347/java-jar-seal-packages

java包装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值