2016-05-15 213 views
0

對於Maven項目,我有以下(簡稱)pom.xml。我添加了com.google.collections依賴項,但是當我執行maven clean package時,我在/target/classes目錄中沒有看到此依賴關係的任何類。此外,當我執行JAR時,出現錯誤(java.lang.NoClassDefFoundError: com/google/common/collect/Iterables)。我忘了什麼?Maven未安裝依賴關係

<project> 
    <groupId>edu.berkeley</groupId> 
    <artifactId>java-page-rank</artifactId> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    <modelVersion>4.0.0</modelVersion> 
    <name>PageRank</name> 
    <packaging>jar</packaging> 
    <version>1.0</version> 
    <dependencies> 
    <dependency> <!-- Spark dependency --> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-core_2.10</artifactId> 
     <version>1.6.0</version> 
    </dependency> 
    <!-- http://mvnrepository.com/artifact/com.google.collections/google-collections --> 
    <dependency> 
     <groupId>com.google.collections</groupId> 
     <artifactId>google-collections</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
</project> 
+1

不要使用'谷歌collections':使用'guava'代替。這是一樣的,刪除了錯誤。 –

回答

2

你不會看到target/classes依賴,這些都只是用於編譯,並從$HOME/.m2/repository拍攝。

如果你需要運行所產生的罐子,你將需要:

  1. 構建完整的類路徑與所有依賴(您從本地Maven倉庫$HOME/.m2/repository使用罐子
  2. 創建uberjar。將包含打包成一個JAR中的所有類(你可以使用Maven在組裝插件或陰影插件)

例如,對於assembly plugin你需要插件添加到插件部分:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
     <manifest> 
      <mainClass>package.for.the.start.Main</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    </plugin> 

後來與assembly:single執行行家,e.g:

mvn clean package assembly:single 

產生的罐子將是target/java-page-rank-1.0-SNAPSHOT-jar-with-dependencies.jar

1

使用maven-assembly-plugin,而不是maven-compiler-plugin如果你希望你的jar包含所有的依賴

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-assembly-plugin</artifactId> 
<version>2.6</version> 
<configuration> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
     <manifest> 
      <mainClass>Main</mainClass> 
     </manifest> 
    </archive> 
</configuration> 
<executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
    </execution> 
</executions>