Maven本地依赖关系不解析子依赖关系

时间:2012-03-30 15:01:37

标签: java maven dependencies

我在解决第三方软件包中的子依赖项时遇到问题。我是一个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 target / test-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中。在此之后我停止尝试将类添加到类路径中,因为它似乎是错误的方法。         在java.lang.ClassLoader.loadClass(ClassLoader.java:266)

5 个答案:

答案 0 :(得分:0)

听起来你正试图从目标文件夹运行你的项目,而且它没有看到传递依赖项。您需要使用maven依赖项插件将这些依赖项与jar文件一起复制。

另见: http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

然后,您可以手动或通过生成的清单文件在这些jar上定义依赖项: http://maven.apache.org/shared/maven-archiver/index.html

答案 1 :(得分:0)

您创建的maven项目只将您的类打包到test-0.1.jar。

如果您使用简单的java命令来运行您的应用程序,您必须提供项目所依赖的所有其他jar到-classpath(或-cp)开关(或通过CLASSPATH)环境变量)。

如果您愿意,可以使用其他包装配置将所有必需的依赖项复制到一个jar中。

以下是此示例,它是此处的逐字副本 - &gt; 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>

答案 2 :(得分:0)

如果你想在classpath中拥有所有依赖项,那么在运行你的jar时,可以使用maven-exec-plugin从maven运行程序,并将所有依赖项自动添加到你的类路径中。

答案 3 :(得分:0)

这里有两个解决方案(问题的原因已经在几个答案中解释过):

1.使用maven 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.您还可以使用maven程序集插件打包jar及其所有依赖项。为此,您需要将以下内容添加到构建的插件中:

<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>

然后,您可以在类路径arg

中使用maven程序集创建的输出jar

答案 4 :(得分: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>