2011-03-13 76 views
20

在我的Maven項目中,有一個模塊(核心)有幾個類的資源。在模塊內部運行類時,它可以獲得自己的資源。一切正常。使用依賴關係的資源?

其中的東西中斷是依賴於內核的另一個模塊試圖運行該類。 Java正在尋找資源的文件夾是此模塊,而不是核心模塊。所以班級失敗了。

簡而言之:如何訪問依賴項的資源?


我已經試驗,試圖通過在覈心的JAR清單Class-Path: .聲明來做到這一點。然而上市可用的資源時JSHookLoader.class.getClassLoader().getResources("");(JSHookLoader是核心,如果這意味着什麼),我得到:

Resource: W:\programming\quackbot-hg\impl\target\classes 
File rebel.xml 

Resource: W:\programming\maven-repo\org\quackbot\core\3.5-SNAPSHOT 
File core-3.5-SNAPSHOT.jar 
File core-3.5-SNAPSHOT.pom 
File maven-metadata-local.xml 
File _maven.repositories 

這當然如我所料的JAR本身是在類路徑複雜的事情,而不是目錄JAR在

有什麼建議嗎?


回到這個項目我仍然有這個問題。其他指南已經討論過使用maven-assembly-plugin和遠程資源插件,但是所有模塊都必須包含怪物插件XML,這是非常痛苦的。

爲什麼我不簡化問題:如何將一個依賴關係JAR添加到資源列表中?

  1. core.jar在文件夾/資源下面有一些資源。運行core.jar我可以看到資源列表中的資源。
  2. impl.jar依賴於core.jar。一旦運行它/資源不在資源列表中,因此會造成嚴重破壞。

這應該很簡單,但我該怎麼做呢?我花了幾個小時試圖找出一個簡單的乾淨的方式來做到這一點,但無濟於事。

回答

21

經過大量的搜索在一個解決方案,我終於迷迷糊糊的。

我的解決方案採用了核心模塊,並使用Maven Dependency Plugin解壓縮它,確保排除META-INF文件夾和編譯類所在的組織文件夾。我排除我不想要的東西,而不是明確地說明我所需要的是,可以輕鬆添加新資源,而無需我一直更新POM。

我不使用程序集插件或遠程資源插件的原因是因爲它們使用專用資源模塊。我不認爲我應該創建一個核心模塊和一個核心資源模塊,核心資源模塊只包含logback和hibernate配置文件+一些其他的東西。

這裏是我使用這樣做

<build> 
     <plugins> 
      <!--Extract core's resources--> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.2</version> 
       <executions> 
        <execution> 
         <id>unpack</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack-dependencies</goal> 
         </goals> 
         <configuration> 
          <includeGroupIds>${project.groupId}</includeGroupIds> 
          <includeArtifactIds>core</includeArtifactIds> 
          <excludeTransitive>true</excludeTransitive> 
          <overWrite>true</overWrite> 
          <outputDirectory>${project.build.directory}/core-resources</outputDirectory> 
          <excludes>org/**,META-INF/**,rebel.xml</excludes> 
          <overWriteReleases>true</overWriteReleases> 
          <overWriteSnapshots>true</overWriteSnapshots> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
     <!--New resource locations--> 
     <resources> 
      <resource> 
       <filtering>false</filtering> 
       <directory>${project.build.directory}/core-resources</directory> 
      </resource> 
      <resource> 
       <filtering>false</filtering> 
       <directory>${basedir}/src/main/resources</directory> 
      </resource> 
     </resources> 
    </build> 
+0

返回的結果感謝您發佈您的解決方案!我有這個確切的問題,並找到了答案......但它是用maven術語寫的,我正在努力破譯它。 – CaffiendFrog 2014-01-28 23:06:05

+1

使用此時請注意循環依賴關係。您可能會遇到困難。 – Michael 2017-12-04 17:47:30

3

如果資源位於/src/main/resources類的JAR他們使用getResourceAsStream()正在訪問,你應該能夠從類中其他JAR訪問這些文件,以及(也使用getResourceAsStream())。這是因爲位於/src/main/resources中的所有文件最終都位於相同的邏輯目錄(CLASSPATH)。換句話說:位於/src/main/resources中的所有文件和編譯自/src/main/java的所有類都可以這麼說合併成到單個命名空間中。

如果即使所有類都使用統一的getResourceAsStream() API,仍然無法訪問文件,您可能會遇到一些類加載可見性問題。

+0

請參閱我的問題中的更新,它不會像您所說的那樣工作。 – TheLQ 2011-03-13 23:11:19

0

我不認爲這是一個好主意。假設你有模塊A。它取決於'B'。 'B'取決於C。基本上,只關於B模塊的接口A。也許,明天 它將依賴性從C更改爲D。如果發生這種情況,您需要更改A。這不是很好的情況,是嗎?所以用隱含的方式聲明來自C的相關A

簡而言之:如何訪問依賴項的資源?

總之:直接聲明這種依賴性。

+0

它被直接聲明。我所說的模塊直接取決於Core。 – TheLQ 2011-03-13 21:58:13

1

如果你的依賴JAR有一類名爲OneDependent,那麼這應該工作:

OneDependent.class.getResourceAsStream(resourcePath) 
+0

這就是我所做的。它只顯示了Core JAR所在的目錄,而不是它的內容。 – TheLQ 2011-03-15 13:27:25

+0

試圖瞭解你在說什麼目錄... getResourceAsStream()調用要麼給你一個資源,要麼是null,如果它找不到資源。你的情況回報是什麼? – 2011-03-16 06:03:10

+1

回覆了JSHookLoader.class.getClassLoader()。getResources(「」);' – TheLQ 2011-03-16 20:30:21

0

我也有類似的情況剛纔什麼的副本。我有一個「測試代碼生成器」,它從src/test/resources目錄獲取數據並將數據泵入H2數據庫。從模塊A可以正常工作,但是當從模塊B調用時沒有。它構造了一個包含多個分號的路徑(由於資源位於jar文件中); moduleA然後無法找到「本地本身」文件。

最後,我加

<testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
     <testResource> 
      <directory>../moduleA/src/test/resources</directory> 
     </testResource> 
    </testResources> 

到moduleB的構建部分,現在通過構建罰款,如預期運行。