2012-03-30 134 views
1

我在解決第三方包的子依賴問題時遇到了問題。我是一位Maven初學者。基本上,它是這樣的:Maven本地依賴不能解決子依賴問題

git clone git://github.com/unidata/thredds.git 
cd thredds 
mvn install 

一切的偉大工程和東西安裝到~/.m2。現在,我寫我自己的代碼,使用了我剛安裝的軟件包:

<?xml version="1.0" encoding="UTF-8"?> 

<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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>test</groupId> 
    <artifactId>test</artifactId> 
    <packaging>jar</packaging> 
    <version>0.1</version> 
    <name>Test Package</name> 

    <dependencies> 
     <dependency> 
      <groupId>edu.ucar</groupId> 
      <artifactId>netcdf</artifactId> 
      <version>4.3.8-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 
</project> 

好吧,當我運行mvn package這也是偉大工程。找到netcdf工件。現在,當我嘗試運行我的代碼時,我開始沿着一條長路徑ClassNotFoundException,不得不將所有netcdf的依賴關係添加到我的類路徑中。

我做錯了什麼,或者thredds軟件包及其所有依賴關係是否會自動獲取?

編輯:該thredds包有許多子模塊,其中之一是netcdf。我的代碼只依賴於netcdf jar。

編輯:快照版本被安裝

$ ls -l ~/.m2/repository/edu/ucar/netcdf/4.3.8-SNAPSHOT/ 
total 4272 
-rw-rw-r-- 1 nwatkins nwatkins  700 2012-03-29 23:23 maven-metadata-local.xml 
-rw-rw-r-- 1 nwatkins nwatkins  182 2012-03-29 23:23 _maven.repositories 
-rw-rw-r-- 1 nwatkins nwatkins 4357494 2012-03-29 23:23 netcdf-4.3.8-SNAPSHOT.jar 
-rw-rw-r-- 1 nwatkins nwatkins 7840 2012-03-29 22:28 netcdf-4.3.8-SNAPSHOT.pom 

編輯:運行這是在一個單一的文件Test.java

$ java -cp target/test-0.1.jar Test 

編輯的代碼:第一錯誤消息

$ java -cp目標/測試0.1.jar測試

Exception in thread "main" java.lang.NoClassDefFoundError: ucar/ma2/InvalidRangeException 
Caused by: java.lang.ClassNotFoundException: ucar.ma2.InvalidRangeException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 

編輯:然後我就嘗試將依賴的jar手動添加到類路徑

$ java -cp ../thredds/cdm/target/netcdf-4.3.8-SNAPSHOT.jar:target/test-0.1.jar Test 

xception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at ucar.nc2.NetcdfFile.<clinit>(NetcdfFile.java:97) 
    at Test.main(Test.java:37) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    ... 2 more 

slf4j包也~/.m2。之後我停止嘗試將其添加到類路徑中,因爲它看起來像是錯誤的方法。 at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

+0

哪裏是對作爲依賴關係的thredds的引用?我只看到netcdf作爲依賴? – khmarbaise 2012-03-30 15:10:33

+0

啊,對不起。 Thredds軟件包包含許多構建和安裝的子模塊,其中之一是netcdf。我的程序只依賴於netcdf軟件包。 – 2012-03-30 15:12:32

+0

如果netcdf軟件包確實是SNAPSHOT,那麼您是否擁有正確的版本?此外,你如何運行你的代碼? – khmarbaise 2012-03-30 15:16:58

回答

0

兩種解決方案在這裏(該問題的原因已經在幾個答案解釋):

1.使用行家Exec插件來啓動你的應用程序:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
         <goal>exec</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <classpathScope>runtime</classpathScope> 
       <executable>java</executable> 
       <commandlineArgs>-classpath %classpath Test</commandlineArgs> 
      </configuration> 
     </plugin> 

2.You也可以打包jar及其所有依賴項,使用maven assembly插件。要做到這一點,你需要添加以下到您的構建插件:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    <executions> 
     <execution> 
     <id>build-package</id> 
     <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

然後你可以使用Maven的裝配在classpath中創建的輸出罐子ARG

0

您已經創建Maven項目包只是你的類: http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

然後,您可以手動,或通過生成的清單文件中定義這些罐子的依賴進入test-0.1.jar。

如果你用一個簡單的命令java運行應用程序,你必須提供你的項目依賴於-classpath(或-cp)交換機的所有其他JAR(或通過CLASSPATH環境變量)。

有替代包裝配置,可以將所有必需的依賴項複製到一個jar中,如果這是你想要的。

下面是一個例子,它是從這裏逐字拷貝 - >http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html。我建議你閱讀整章(閱讀整本書)以便更好地理解。

<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>org.sonatype.mavenbook.assemblies</groupId> 
    <artifactId>executable-jar</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>Assemblies Executable Jar Example</name> 
    <url>http://sonatype.com/book</url> 
    <dependencies> 
     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.4</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.2-beta-2</version> 
       <executions> 
        <execution> 
         <id>create-executable-jar</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <configuration> 
          <descriptorRefs> 
           <descriptorRef> 
            jar-with-dependencies 
           </descriptorRef> 
          </descriptorRefs> 
          <archive> 
           <manifest> 
            <mainClass>org.sonatype.mavenbook.App</mainClass> 
           </manifest> 
          </archive> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

我編輯了我的帖子。我添加了netcdf jar,但後來有傳遞依賴關係。我想要那些自動解決。 – 2012-03-30 15:32:03

+0

@Noah。如果你使用'create-executable-jar'程序集,所有的傳遞依賴將被添加到結果jar中。 – 2012-03-30 15:34:13

+0

你應該使用maven-assembly-plugin的版本2.3而不是2.2-beta ... – khmarbaise 2012-03-30 16:20:18

0

如果你想在classpath中所有的依賴關係,運行你的罐子時,您可以使用maven-EXEC-插件從withing Maven的運行程序,並自動添加到您的類路徑中所有的依賴。

+0

你有這樣的例子嗎? – 2012-03-30 15:31:22

+0

查看Guillaume的帖子 – 2012-03-30 16:02:33

0

你缺少的依賴關係爲:

組織/ SLF4J /的LoggerFactory

這意味着,換句話說,你需要的依賴添加到您的項目:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
</dependency> 

假設你正在使用log4j?

此外,基於缺少的類:ucar.ma2.InvalidRangeException它看起來需要其他補充依賴項,除非(如果存在,可以查看文檔)。

<dependency> 
     <groupId>edu.ucar</groupId> 
     <artifactId>netcdf</artifactId> 
     <version>4.3.8-SNAPSHOT</version> 
    </dependency>