2015-06-22 22 views
3

我在我的Java項目中創建了一個XSD文件,該文件定義了一個用戶可編輯的輸入文件(例如,假設XSD被稱爲userinput。 xsd和用戶可編輯的文件是userinput.xml)。當程序運行時,它使用JAXB來驗證用戶在XML文件中沒有犯任何錯誤,因爲它將文件解組到DOM中。我應該在哪裏放置一個用於JAXB代碼gen和XML驗證的XSD文件

我已經使用Maven Standard Directory Layout構建了我的項目,並使用xjc生成了JAXB對象工廠和其他類,並將它們放置在名爲/ src/main/java/my/name/space/generated/userinput的目錄中XSD的名稱)。

我已將XSD文件放在/ src/main/resources中。

當我打包我的jar文件,該文件是在罐子裏的根,我可以引用它在Java代碼如下(特別是在第4行中提到的資源注):

JAXBContext jaxbContext = JAXBContext.newInstance("my.name.space.generated.userinput"); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(getClass().getResource("/userinput.xsd")); 
unmarshaller.setSchema(schema); 
JAXBElement<?> userinputType = (JAXBElement<?>) unmarshaller.unmarshal(new FileInputStream("userinput.xml")); 

這可行,但它看起來不正確,因爲它意味着如果我想擴展到多個輸入文件,我最終可能會在源代碼管理的資源目錄和jar文件的根目錄中產生很多.xsd文件。

此外,當我從我的IDE,而不是從包裝罐子運行程序,我必須將第四條語句更改爲:

Schema schema = schemaFactory.newSchema(getClass().getResource("src/main/resources/userinput.xsd")); 

我應該在哪裏放置XSD文件(一)在我的源代碼控制(即,Maven結構)和(b)在我的jar文件中? [注意:通過我的IDE運行xjc會將其放入.../generated/userinput目錄,但Maven會在打包時忽略它。]

我正在查找指示存在某種常用方法的答案,所以如果可能的話,想參考。如果這對於開發人員來說目前是一個不確定的選擇,那麼請說出來(最好是引用),因爲我明白,stackoverflow不是收集意見的地方。

+0

XML模式文件與許多其他文件一樣是一種資源。它可能是網絡上的資源。除此之外,它可能是一個定義應用程序之間接口的資源:那麼它應該放在所有人都可以使用的地方。如果它與Java庫捆綁在一起,那麼一個jar可能是正確的地方。 – laune

+0

我意識到我的問題不明確。我詢問源代碼中的哪個特定目錄,以及將XSD文件放在哪個(可能不同)目錄內,以便與其他人期望的一致。它是一個免費的決定,還是像Maven標準目錄佈局那樣可以用作指南? – johnsgp

+0

在Eclipse中,項目通常包含子目錄src,bin,resources。在一個jar文件中,一個.xsd將被你自己的SW所訪問,所以沒有「別人期望」,我想。我在META-INF或某些軟件包中看到了xsd文件,還有.class或以下的./src文件。 – laune

回答

2

的默認佈局是將模式置於src/main/resources。然後您的模式schema.xsd可用作資源getClass().getResource("/schema.xsd")
有些人使用src/main/schemassrc/main/xsd。但是如果你想使用模式作爲資源,最好使用默認值。

我不明白爲什麼這「看起來不正確」。究竟是什麼問題?版本控制中的許多文件? JAR中有很多文件?爲什麼這是一個問題?

如果你想構造和模塊化,分別在自己的Maven模塊中編譯你的模式。我通常更喜歡每個規範/版本的一個模塊(例如參見ogc-schemas項目)

如果您需要在IDE中執行getClass().getResource("src/main/resources/userinput.xsd"),這表示您在IDE中有一個錯誤的項目配置。 /看作類路徑的一部分,所以只需要/userinput.xsd就行了,這並不意味着src/main/resources是錯誤的地方,這意味着你的項目配置不正確。在代碼生成的IDE上,代碼生成是構建過程的一部分,使用Maven插件進行模式編譯。

聲明:我是的作者,也是上面提到的OGC Schemas項目的作者。

+0

謝謝,lexicore,這是一個很好的答案!事實證明,這是我在IDE中的項目配置錯誤。我不知道什麼是錯誤的,因爲當我用資源重新測試「/userinput.xsd」時,它在IDE中工作。我一定經歷了一系列最終使它工作的步驟,儘管我不知道它們是什麼。 – johnsgp

+0

我不小心按下了Enter,並沒有完成我的評論......剩下的就是這個。我現在已經開始使用maven-jaxb2插件,它使項目變得更加整潔 - 「mvn包」的目標完成了一切。我認爲在/ src/main/resources中有許多XSD文件是個問題,因爲它會變得混亂。你的分離成多個瓶子的建議也可以解決這個問題。 – johnsgp

相關問題