1. 程式人生 > >META-INF/MANIFEST.MF檔案中Sealed頭的作用與含義

META-INF/MANIFEST.MF檔案中Sealed頭的作用與含義

    政府某部門想打造一個國產軟體平臺,從硬體伺服器、作業系統、資料庫、應用伺服器中介軟體等全部採用國產平臺,並將一個執行良好的應用軟體進行改造,以適應國產資料庫與原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");  
  }



相關推薦

META-INF/MANIFEST.MF檔案Sealed作用含義

    政府某部門想打造一個國產軟體平臺,從硬體伺服器、作業系統、資料庫、應用伺服器中介軟體等全部採用國產平臺,並將一個執行良好的應用軟體進行改造,以適應國產資料庫與原Oracle資料庫在SQL語句、系統函式等方面的不同。     apusic應用伺服器作為國產應用伺服器中

eclipse使用--解決maven專案報錯:找不到META-INF\MANIFEST.MF檔案的問題

錯誤描述 在使用maven管理某個專案時,發現pom.xml檔案的檔案頭有一個紅色的錯誤標記,錯誤提示為:xxx\target\classes\META-INF\MANIFEST.MF(系統找不到指定路徑或檔案)。 執行環境 wildfly10.0.0.F

解決Maven專案pom.xml檔案報xxx\target\classes\META-INF\MANIFEST.MF (系統找不到指定的路徑)問題

錯誤解決步驟:   1.找到eclipse的project選單選擇clean...選項          2.選擇Clean all projects 或者 Clean projects selectd blow(選擇此項必須勾選出錯的專案)          3.等著progress視圖裡的b

JAR包結構,META-INF/MANIFEST.MF文件詳細說明[全部屬性][打包][JDK]

信息 name nta 方法 聲明 類名 systems 簽名 核心 轉載請註:[https://www.cnblogs.com/applerosa/p/9736729.html] 常見的屬性 jar文件的用途 壓縮的和未壓縮的 jar工具 可執行的JAR

m2e-wtp error: /target/m2e-wtp/web-resources/META-INF/MANIFEST.MF (No such file or directory)

     今天在部署Maven專案時,為了得到最新的檔案,就把Maven中target下的檔案全部都刪了,結果啟動不了了,出了以下問題:    m2e-wtp error: <path>/target/m2e-wtp/web-

maven打包在MANIFEST.MF檔案增加屬性

最近在學習java agent,需要在生成的jar包裡面的 META-INF/MAINIFEST.MF 必須包含 Premain-Class這個屬性。採用MAVEN的maven-jar-plugin外掛完成。 maven-jar-plugin外掛預設生成的MAINIFEST

zipfile.BadZipfile: File name in directory "AndroidManifest.xml" and header "META-INF/MANIFEST.MF" d

問題 python 使用zipfile庫來解壓apk壓縮檔案的時候,出現了報錯zipfile.BadZipfile: File name in directory "AndroidManifest.xml" and header "META-INF/MANIFEST.MF" differ

meta-inf資料夾以及MANIFEST.MF檔案作用

meta-inf相當於一個資訊包,目錄中的檔案和目錄獲得Java 2平臺的認可與解釋,用來配置應用程式、擴充套件程式、類載入器和服務 manifest.mf檔案,在用jar打包時自動生成的。 META-INF 存在程式入口相關資訊,  我們把MANIFEST中的配置資訊進行分類,可以歸納出下面幾

JAR包MANIFEST.MF檔案詳解以及編寫規範

JAR包中的MANIFEST.MF檔案詳解以及編寫規範 參考百度百科的解釋如下: http://baike.baidu.com/item/MANIFEST.MF MANIFEST.MF:這個 manifest 檔案定義了與擴充套件和包相關的資料。單詞“manifest”的意思是“

0066 Linux多個Java檔案打包成單個可執行jar檔案及其manifest.mf檔案編寫規則

現在我有三個Java類檔案:GuessGame.java Player.java GameLauncher.java(含主函式) 先用編譯命令: javac GuessGame.java Player

Common-io-1.4.jarMANIFEST.MF檔案原始碼

MANIFEST.MF檔案原始碼 Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Bu

Jar 命令Manifest.mf檔案詳解

1.在命令列中輸入“jar -help”,就k可看到jar的詳細用法了。 2.示例:   1)將兩個class文件歸檔到一個jar檔案中:jar -cvf  XX.jar  A.class B.class   2 )使用清單檔案Manifest.mf將dir目錄下的所有檔案

shell 去除utf8檔案bom的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

程式碼生成MANIFEST.MF檔案

我在查詢怎麼把java專案打包成jar包時,很多文章都提到了MANIFEST.MF這個檔案,但是對於怎麼生成這個檔案,都只是說了手寫,手寫,手寫。真好意思啊。 於是我就寫了一個簡易版的自動生成程式碼,只生成了比較關鍵的部分。 lib資訊取自.classpath檔案,如果由於ide

JAR 包及MANIFEST.MF 檔案詳解

常常在網上看到有人詢問:如何把 java 程式編譯成 .exe 檔案。通常回答只有兩種,一種是製作一個可執行的 JAR 檔案包,然後就可以像.chm 文件一樣雙擊運行了;而另一種是使用 JET 來進行 編譯。但是 JET 是要用錢買的,而且據說 JET 也不是能把所有的 Java 程式都編譯成執行檔

關於配置檔案約束問題 xsd 版本不對應

今天,重新寫ssh 專案 時發現,配置檔案的 的頭約束 不對,  xsd檔案的版本始終對不上, 只能選擇修改 1.指定本地的xsd 檔案  preferences  搜尋 xml ->xml catalog   add ->  key type :URL   lo

spring16-----XML名稱空間和Spring配置檔案

一. 什麼是名稱空間 在 XML 中,元素名稱是由開發者定義的,當兩個不同的文件使用相同的元素名時,就會發生命名衝突。類似package的作用。 這個 XML 文件攜帶著某個表格中的資訊: 1 <table> 2 <tr> 3 <td>

MANIFEST.MF檔案全面解析

當我們用Jar命令打完包後,會在根目錄下面建立META-INF目錄,該目錄下面會有一些對該Jar包資訊的描述,其中肯定會有一個MANIFEST.MF檔案,該檔案包含了該Jar包的版本、建立人和類搜尋路徑等資訊,當然如果是可執行Jar包,會包含Main-Class屬性,表明M

Eclipse 打jar包,並且在win7 下執行jar檔案MANIFEST.MF檔案指定執行入口

1:為即將匯出的java專案新增一個檔案,檔名為:MANIFEST.MF     這個檔案可以定義jar包的一些引數,主要是jar檔案執行入口; 檔案內容為: Manifest-Version: 1.0 Class-Path: . Main-Class: test 將tes

Manifest.xml檔案主要包括哪些資訊?

manifest:根節點,描述了package中所有的內容。uses-permission:請求你的package正常運作所需賦予的安全許可。permission: 聲明瞭安全許可來限制哪些程式能你p