2012-03-30 172 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>