政府某部门想打造一个国产软件平台,从硬件服务器、操作系统、数据库、应用服务器中间件等全部采用国产平台,并将一个运行良好的应用软件进行改造,以适应国产数据库与原Oracle数据库在SQL语句、系统函数等方面的不同。
apusic应用服务器作为国产应用服务器中间件参与了移植测试和压力测试工作。首先跟应用软件开发商基于oracle数据库做了移植测试,从weblogic平台移植到了apusic应用服务器,实现apusic + oracle运行正常。
然后跟国产数据库做移植测试,国产数据库采用gbase。应用软件用到了hibernate2作为数据持久工具,由于hibernate没有内置对gbase的dialect支持,gbase厂商自己写了一个类,命名为net.sf.hibernate.dialect.GBaseDialect,并打包成gbase_dialect.jar,放到了应用软件的lib文件夹下。
然后启动apusic应用服务器时报错:
net.sf.hibernate.MappingException: could not instantiate id generator
at net.sf.hibernate.id.IdentifierGeneratorFactory.create(IdentifierGeneratorFactory.java:82)
at net.sf.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:82)
at net.sf.hibernate.persister.AbstractEntityPersister.<init>(AbstractEntityPersister.java:630)
at net.sf.hibernate.persister.EntityPersister.<init>(EntityPersister.java:716)
at net.sf.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:42)
at net.sf.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:137)
at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:768)
at com.lbs.commons.op.HibernateSession.currentSession(HibernateSession.java:32)
at com.lbs.commons.op.OPManager.query(OPManager.java:159)
at com.lbs.cp.plugin.CodeListPlugIn.init(CodeListPlugIn.java:59)
at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:1158)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:473)
at javax.servlet.GenericServlet.init(GenericServlet.java:215)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1053)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:955)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4035)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4338)
at com.cvicse.inforsuite.webContainer.GeronimoStandardContext.access$201(GeronimoStandardContext.java:60)
at com.cvicse.inforsuite.webContainer.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:343)
……//此处略去部分异常信息
Caused by: net.sf.hibernate.MappingException: Dialect does not support sequences
at net.sf.hibernate.dialect.Dialect.getSequenceNextValString(Dialect.java:319)
at net.sf.hibernate.id.SequenceGenerator.configure(SequenceGenerator.java:62)
at net.sf.hibernate.id.IdentifierGeneratorFactory.create(IdentifierGeneratorFactory.java:78)
... 83 more
貌似是Dialect不支持sequences(getSequenceNextValString()),可是gbase厂商提供的类里有对序列的支持。
后来在测试中发现,即使从应用的lib中删除gbase的gbase_dialect.jar,仍然报同样的错误,说明这个jar根本没有加载。
由于gbase的gbase_dialect.jar中,GBaseDialect类所在的包为net.sf.hibernate.dialect,跟hibernate提供的其他数据库的dialect包名一致,所以将gbase提供的GBaseDialect类打包在了hibernate2.jar中,跟hibernate提供的其他数据库的dialect在一个jar中,删除gbase_dialect.jar,这时启动apusic正常。
据此判断,net.sf.hibernate.dialect.GBaseDialect类文件本身没有问题,gbase提供的gbase_dialect.jar中,除了这个类文件外,就只有META-INF下MANIFEST.MF文件,所以怀疑是这个文件有问题。打开这个文件,只有两行内容:
Manifest-Version: 1.0
Sealed:true
将gbase_dialect.jar中META-INF下MANIFEST.MF文件Sealed:true去掉,重新打包,放到应用lib下,将先前打包进hibernate2.jar的GBaseDialect类删除,重启apusic,终于正常。
到网上搜索关于Sealed:true,找到如下资料:
引用
包密封
密封 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()方法,默认实现是:
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。
分享到:
相关推荐
此包是本人在修补weblogic漏洞时,http://sn.cloud.ccb.com/bea_wls_internal/classes/META-INF/MANIFEST.MF漏洞实在没办法,试遍网上所有方法,在被逼无奈之下,花了两周研究出来的,就不要想在其他地方找到了,...
`META-INF` 文件夹是 Java 应用程序中的一个重要组成部分,它主要用于存放与应用程序相关的元数据信息,例如清单文件(`MANIFEST.MF`)等。在 Eclipse 开发环境中,对于每一个打包成 JAR 的应用程序来说,`META-INF`...
* manifest.mf文件:这个文件是在用JAR打包时自动生成的,用于存放JAR文件的配置信息。 在Java Web应用程序中,Web-Inf和Meta-Inf扮演着重要的角色。Web-Inf用于存放Web应用程序的配置文件、类文件、库文件等,而...
标题和描述中提到的文件名ASPADS.IN_, ASPNETOC.DL_, ASPPERF.DL_, ASP.DL_, ASP.MF_, ASP.MO_,这些看起来像是与微软的ASP(Active Server Pages)技术相关的一些组件或者更新文件。在Windows 2003 Server环境中,...
3. **Manifest-Version**: 用于声明MANIFEST.MF文件的版本,通常是`1.0`。 4. **Implementation-Title**, **Implementation-Version**, **Implementation-Vendor**: 这些是可选的,提供了关于实现的软件包的更多...
MANIFEST.MF
META-INF/MANIFEST.MF META-INF/maven/org.slf4j/slf4j-api/pom.properties META-INF/maven/org.slf4j/slf4j-api/pom.xml org.slf4j.ILoggerFactory.class org.slf4j.IMarkerFactory.class org.slf4j.Logger.class ...
在MANIFEST.MF文件中,定义Bundle-SymbolicName和Bundle-Version属性,以标识bundle的唯一性和版本。 3. **导入导出包**:在MANIFEST.MF中,声明bundle需要导入和导出的包。导入表示对其他bundle的依赖,导出表示向...
resources = resolver.getResources("classpath:META-INF/MANIFEST.MF"); Assert.assertEquals(1, resources.length); } @Test public void testClasspathAsteriskPrefix() throws IOException { ...
META-INF/MANIFEST.MF commonj.timers.CancelTimerListener.java commonj/timers/package.html commonj.timers.StopTimerListener.java commonj.timers.Timer.java commonj.timers.TimerListener.java commonj....
1. "bea_tuxedo_quick_start.doc" - 这可能是一个Word文档,包含了教程的全文内容,详细讲解了Tuxedo的安装、配置、编程模型、服务创建与管理、事务处理以及相关的实例代码。初学者可以通过阅读这份文档,逐步学习并...
在本文中,我们将深入探讨如何在 Java 中读取和写入 MANIFEST.MF 文件,以及如何使用 Maven 进行打包时配置 MANIFEST.MF。 首先,MANIFEST.MF 文件通常位于 JAR 文件的根目录下,它的结构是基于行的,每行一个属性...
1. **MANIFEST.MF文件**:`META-INF`目录下的`MANIFEST.MF`是每个Java归档文件的核心组成部分。它是一个文本文件,包含了关于`.jar`文件的基本信息,如主类(Main-Class)、版本信息、依赖库、作者信息等。这对于...
在IT行业中,`META-INF` 是一个特殊目录,通常出现在Java的JAR文件、Android的APK文件或者一些归档格式如RAR、ZIP中。这个目录包含了一些元数据(metadata)和配置信息,对理解软件的结构和运行至关重要。在这个场景...
MANIFEST.MF文件通常位于JAR文件的`META-INF`目录下,该文件由多行键值对组成,每行以`键: 值`的形式表示。这些键和值之间通过冒号分隔,且每行以换行符结束。例如: ```plaintext Manifest-Version: 1.0 Created-...
这将创建一个名为 test.jar 的 JAR 文件包,该文件包中包含了一个 META-INF/MANIFEST.MF 文件和一个 test 目录,该目录中包含了 Test.class 文件。 用户可以双击运行该 JAR 文件包,系统将自动使用 javaw.exe 打开...
META-INF/MANIFEST.MF META-INF/maven/net.sf.jodconverter/jodconverter/pom.properties META-INF/maven/net.sf.jodconverter/jodconverter/pom.xml document-formats.js ...
Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation,wls filter,WLS filter code
META-INF/MANIFEST.MF META-INF/NOTICE META-INF/services/javax.xml.stream.XMLEventFactory META-INF/services/javax.xml.stream.XMLInputFactory META-INF/services/javax.xml.stream.XMLOutputFactory META-INF/...
META-INF/MANIFEST.MF META-INF/NOTICE META-INF/maven/org.mybatis.caches/mybatis-ehcache/pom.properties META-INF/maven/org.mybatis.caches/mybatis-ehcache/pom.xml org.mybatis.caches.ehcache.EhcacheCache....