Автор оригинала: Pankaj Kumar.
Java JAR предоставляет возможность запечатать пакет. Пакет Java jar seal означает, что если какая-либо программа использует эту банку, то все классы должны быть загружены из самой этой банки. Любая попытка загрузить классы из других файлов jar приведет к появлению java.lang.Исключение безопасности
. Документация по запечатыванию упаковок банок кажется запутанной, поэтому мы изучим эту функцию с помощью примеров программ.
Пакеты с печатью Java jar
Для эффекта герметизации упаковки jar нам нужно, по крайней мере, два файла jar для использования в тестовой программе. На рисунке ниже показаны два моих java-проекта с одинаковыми именами пакетов, но с разными классами.
Прочитайте следующие сообщения, чтобы узнать, как создавать jar из классов java и как запускать файл jar на java.
Чтобы запечатать пакеты в банку, нам нужно добавить ее записи в файл манифеста банки. Итак, у меня есть файл манифеста со следующим содержимым.
Чтобы запечатать пакеты в банку, нам нужно добавить ее записи в файл манифеста банки. Итак, у меня есть файл манифеста со следующим содержимым.
Name: com.jd.seal Sealed: true
Теперь я запускаю следующие команды в обоих проектах, чтобы сгенерировать два файла 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
Теперь я напишу пример программы, которая будет использовать оба этих файла 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(); } }
Итак Мой класс
пытается загрузить класс A из файла jar seal1.jar и класс В от seal2.jar. Давайте попробуем скомпилировать и запустить этот класс и посмотрим, что произойдет.
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)
Как вы можете видеть, он выдает java.lang.Исключение SecurityException
во время выполнения с сообщением об ошибке ” пакет запечатан “.
Запечатывание пакета Jar помогает нам убедиться, что все классы загружены из одной и той же версии файла jar.
Совет : Если вы хотите, чтобы все пакеты файла jar были запечатаны, вы можете просто добавить запись для Запечатанного как true. Чтобы исключить запечатывание любой упаковки, вы можете добавить дополнительную запись с надписью “Запечатано как ложь”.
Совет ||: Если вы хотите, чтобы все пакеты файла jar были запечатаны, вы можете просто добавить запись для Запечатанного как true. Чтобы исключить запечатывание любой упаковки, вы можете добавить дополнительную запись с надписью “Запечатано как ложь”.
Sealed: true Name: com.jd.util Sealed: false
Это все о запечатывании пакетов java jar.
Ссылка: Документация Oracle