2013-03-13 86 views
8

假設我有兩個項目,A和B.Java項目,萬一這很重要。跨項目指定XSD schemaLocation的正確方法是什麼?

項目A包含一堆表示核心類型和元素的XSD文件。它們都被放置在一個稱爲「定義」的包中。這建立到project-a.jar

項目B代表一個擴展項目,它允許定義它自己的類型和元素。我創建了一個新的模式並將其放置在「definition.extension」包中。這被構建到project-b.jar

現在,對於項目B中的XSD,我應該將schemaLocation作爲include的具體值嗎?

schemaLocation="../core-types.xsd"沒有太大的工作(我知道,它需要一個URI),但究竟是適當的還是標準的方法呢?谷歌發現我更多的人問這個問題,明確的標準方法是什麼纔是真正解決這個問題的正確方法。

這不能說我在編譯期間以編程方式調整schemaLocation ...或者我需要一個構建步驟/腳本,在編譯過程中動態替換schemaLocation ...對嗎?

我不是在尋找像「把他們放在一個共享位置」的答案。我正在尋找更多的東西,沿着使用相對引用而不是硬編碼引用的開發環境。

僅供參考,我使用的是IntelliJ IDEA,以防有IDE特定的方法。

+0

[EntityResolver的](http://docs.oracle.com/javase/6/docs/api/ org/xml/sax/EntityResolver.html)可能是運行時的技術解決方案。 – Claude 2013-03-13 09:25:35

+0

URI也可以引用嵌入到jar中的文件。見[這篇文章](http://stackoverflow.com/questions/2049659/get-a-file-or-uri-object-for-a-file-inside-an-archive-with-java)。 – geert3 2013-03-13 15:52:02

+0

也許Class.getResource()或ClassLoader.getResource()?看到[這篇文章](http://stackoverflow.com/questions/6608795/what-is-the-difference-between-class-getresource-and-classloader-getresource) – CAB 2013-03-15 18:43:57

回答

1

如果您只是想讓IntelliJ停止以紅色顯示您的包含,您可以在包含中使用一些自定義URI。然後您可以進入項目設置 - >架構和DTD,您可以將該URI映射到本地文件。

如果您需要在運行時進行模式驗證,那是一個不同的故事。您可能需要使用XML目錄。如果你使用JAXB,你應該看看這個問題:jaxb - how to map xsd files to URL to find them

0

你應該使用XML Catalogs。此鏈接通過XML專家Norman Walsh詳細介紹了XML目錄 - 以及如何在Java中使用它們。 Quote:

這些目錄文件可用於映射公共和系統標識符和其他URI到本地文件(或只是其他的URI)。

上述標識符通常是schemalocation S或namespace是你在架構import的使用。

當使用這樣的目錄,以避免混亂和一些bug in XJC,我強烈建議你從架構進口XML模式刪除所有schemaLocation s,而只保留namespace(當然如果你的選擇)。例如:

<import namespace="http://www.w3.org/1999/xlink" /> 

然後爲每個名稱空間指定目錄中實際模式位置的映射。例如,使用OASIS XML目錄格式:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 
    <uri name="http://www.w3.org/1999/xlink" uri="w3c/1999/xlink.xsd" /> 
</catalog> 

在編譯的時候,如果你是從模式生成JAXB註釋類,我建議你使用Episodes才達到獨立的架構編譯又名modular schema compilation。例如maven-jaxb2-plugin也支持這個功能,它也有catalogs的高級支持。

對於運行時,根據您的XML使用情況,您應該嘗試使用本機支持XML目錄的庫,例如大多數Java Web服務框架(JAX-WS RI/Metro,Apache CXF ...)if例如,您正在開發Web服務。如果你不能或如果你想更好地控制XML目錄(例如能夠從類路徑加載模式),我邀請你看看前面提到的XML Entity and URI Resolvers頁面,尤其是使用目錄與熱門應用爲您的應用程序添加目錄支持。基本上,你可以使用org.apache.xml.resolver.tools.CatalogResolver和可選的(用於更好的控制)org.apache.xml.resolver.CatalogManager類。對於自定義CatalogResolver/CatalogManager的具體例子,可以看代碼源從Apache的commons-configurationAuthzForceCXF

相關問題