引用
包密封
密封 JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。
要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name 头,然后加上值为“true”的 Sealed 头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:
Name: com/samplePackage/
Sealed: true
Name 头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于在 Name 头中指定的文件或者包。在上述例子中,因为 Sealed 头出现在 Name 头后并且中间没有空行,所以 Sealed 头将被解释为只应用到包 com/samplePackage 上。
如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个 SecurityException 。
在打包jar时声明Sealed: true,主要目的是防止不同版本之间的jar之间互相调用类,从而导致不可预知的问题,比如在应用下如果有两个hibernate的jar,分别是hibernate2.jar、hibernaet2_1.jar,明显两个版本不一致,打包时声明Sealed: true,则hiberante2.jar里的类只能装载调用本Jar文件里的其他类,而不能调用hibernate2_1.jar里的其他类。
gbase打包时包名与Hibernate提供的dialect包名均为net.sf.hibernate.dialect,且声明Sealed: true,JVM会认为所有在net.sf.hibernate.dialect包中的文件都应该在同一个jar下,hibernate2.jar中的类不会去调用gbase_dialect.jar下的文件,找不到net.sf.hibernate.dialect.GBaseDialect类的情况下,JVM使用hibernate提供的默认的GenericDialect,这个类继承自abstract类Dialect,Dialect提供的getSequenceNextValString()方法,默认实现是:
Java代码
1.public String getSequenceNextValString(String sequenceName)
2. throws MappingException
3. {
4. throw new MappingException("Dialect does not support sequences");
5. }
public String getSequenceNextValString(String sequenceName)
throws MappingException
{
throw new MappingException("Dialect does not support sequences");
}
将gbase打包时Sealed: true去掉,则JVM可以顺利找到gbase的net.sf.hibernate.dialect.GBaseDialect。
分享到:
相关推荐
它不仅记录了JAR包的基本元数据,还提供了运行时所需的配置信息。本文将详细介绍MANIFEST.MF文件中的各个关键字段及其作用,并通过示例来帮助读者更好地理解。 #### MANIFEST.MF 文件结构 MANIFEST.MF文件通常位于...
6. **隐藏(密封)**:模块可以被声明为密封的,这意味着除了模块本身,其他模块不能包含该模块内的包。这增强了模块的封装性。 7. **自动模块(Automatic Modules)**:在没有`module-info.java`的情况下,JVM会...
2. **密封模块**(Sealed Module):限制了包的导出,只能由指定模块提供。 3. **隐藏模块**(Hidden Module):不导出任何包,其他模块无法访问。 4. **自动模块**(Automatic Module):没有`module-info.java`...
5. **密封包**:Java 9还引入了“密封包”的概念,允许开发者限制特定包只能被某些模块或其子包使用,从而加强了封装性。 6. **服务提供与消费**:模块系统通过`provides`和`uses`关键字支持服务发现和服务提供者...