2011-03-29 60 views
6

我正在开发使用Cassandra NoSQL数据库的应用程序,并且正在添加Web界面。我有2个项目:cassandra-access(这个项目是DAL)和web(这个项目是web应用程序)。与Maven传递第三方依赖关系

情景很简单。 Cassandra访问依赖于hector.jar,它不在maven仓库中。于是我通过MVN加入这个依赖于我的本地库安装:安装文件和我列出我的仓库在父POM:

<repositories> 
     <repository> 
     <id>loc</id> 
     <url>file://${basedir}/../mvn-local-repository</url> 
    </repository> 
</repositories> 

在Web项目POM我加在卡桑德拉访问的依赖。但是,当我启动Web应用程序与hello世界从数据库中读取我得到classNotFound异常,如果hector.jar不在类路径。当我编写mvn clean install时,web项目的结果战争在WEB-INF/lib中不包含hector.jar。这进一步证实了我的理论。

如何实现这一战争获得所有的传递依赖?我认为所有在编译范围内(这是默认的)的依赖将被复制。

Web项目POM:

<dependency> 
     <groupId>net.product</groupId> 
     <artifactId>cassandra-access</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </dependency> 

卡桑德拉访问POM:

<dependency> 
    <groupId>me.prettyprint</groupId> 
    <artifactId>hector</artifactId> 
    <version>0.7.0</version> 
</dependency> 
+0

我发现上面的文字作品,以及。我刚刚在POM中引起了警告,导致maven不会包含所有的过渡依赖。调试这种情况的最好方法是使用mvn依赖项:tree -X – 2011-03-30 08:49:14

回答

1

它也许不是最佳的解决方案,但它为我工作: 把赫克托罐子中的lib目录卡桑德拉访问。 添加到卡桑德拉访问POM:

<dependency>  
    <groupId>%HECTOR_JAR_GROUP_ID%</groupId> 
    <artifactId>%HECTOR_JAR_ARTIFACT_ID%</artifactId> 
    <version>%HECTOR_JAR_VERSION%</version> 
    <scope>system</scope> 
     <systemPath>${basedir}/lib/%HECTOR_JAR_NAME%</systemPath> 
</dependency> 

然后添加以下插件:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin>