2012-06-06 168 views
0

我有一個Maven Web應用程序正在使用我創建的jar並在我的pom文件中被引用爲依賴項。如何在Maven項目中公開依賴項的依賴關係

我創建的jar文件有另一個jar文件作爲依賴項。

當我部署Web應用程序時,它說我無法找到我創建的jar文件的依賴項中的類。

解決此問題的唯一方法是添加jar文件的依賴項作爲war文件的依賴項。這似乎沒有必要。

有沒有一種方法可以配置war文件,以便能夠查看依賴於相關jar文件中定義的類?

我的jar pom文件看起來像:具有無法找到的類的依賴關係是QRS之一。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>group</groupId> 
<artifactId>artifact</artifactId> 
<packaging>jar</packaging> 
<version>1.0.7</version> 
<name>name</name> 
<dependencies> 
    <dependency> 
     <groupId>group2</groupId> 
     <artifactId>QRS</artifactId> 
     <version>8.1</version> 
    </dependency> 
</dependencies> 
    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib</classpathPrefix> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${project.build.directory}/classes/lib</outputDirectory> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

我的戰爭POM樣子:

<dependency> 
     <groupId>group</groupId> 
     <artifactId>artifact</artifactId> 
     <version>1.0.7</version> 
    </dependency> 

,並配置了戰爭插頭:

  <plugin> 
      <dependencies> 
       <dependency> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-war-plugin</artifactId> 
        <version>2.2</version> 
       </dependency> 
      </dependencies> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <warName>${project.name}-${project.version}-${env}</warName> 
       <webResources> 
        <resource> 
         <directory>src/main/webapp/WEB-INF</directory> 
         <filtering>true</filtering> 
         <include>jboss-web.xml</include> 
         <include>web.xml</include> 
         <targetPath>/WEB-INF</targetPath> 
        </resource> 
       </webResources> 
       <warSourceExcludes>**/toAggregateAndRemove/**</warSourceExcludes> 
       <goal>war:manifest</goal> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

回答

1

的Maven已經解決了傳遞依賴。

這並不表示你很可能沒有正確做它:你創建的另一個jar應該是一個帶有自己的pom的Maven項目,通過mvn install至少在本地安裝,並且被列爲依賴項第二個項目(使用它的那個)。

使用jar的項目只需要指定該工件作爲其依賴項,另一個項目的依賴項將被傳遞確定幷包含爲項目依賴項。

+0

另一個jar是一個擁有自己的pom的maven項目,並被拉入我的本地倉庫,並被列爲戰爭文件的依賴項,並列出了傳遞依賴項作爲依賴項。 war文件只是將jar文件列爲依賴關係,而不是傳遞依賴關係。 – Eric

+0

@Eric您如何部署?除非你告訴它,否則Maven不會奇蹟般地創建一個與所有其他類(除你自己之外)的超級罐子。您也可以使用Maven將項目依賴項複製到一個目錄中,例如將它們包含在一個tar文件中。否則,編譯時間依賴就是這樣 - 編譯時間依賴。 –

+0

我正在向jboss部署一個war文件。 我有maven複製jar文件的相關性到實際的jar文件。 當我在Web項目中查看jar文件時,我看到所有依賴的jar文件,包括缺少類的jar文件。 它編譯得很好,它只是不會部署,因爲春天試圖instanciate豆和不能,因爲它無法找到類的依賴依賴 – Eric

1

@Dave Newton回答說,這應該是默認情況下發生的。

從問題的片段有幾個觀察 - 如果這能幫助...

  • 包裝相關的罐子爲artifact項目的JAR的文件夾中。

  • 將maven war插件jar本身定義爲dependency用於maven war插件 - 這根本不是必需的!

  • war:manifest在maven war插件配置中的目標。

有可能實際上創建戰爭的war:war未運行。