【问题标题】:Maven local dependency not resolving sub-dependenciesMaven本地依赖不解决子依赖
【发布时间】:2012-03-30 15:01:36
【问题描述】:

我在解决来自第三方包的子依赖项时遇到问题。我是一个 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)

edit:然后我只是尝试手动将依赖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)

【问题讨论】:

  • 在哪里引用 thredds 作为依赖?我只将 netcdf 视为依赖项?
  • 啊,对不起。 thredds 包有许多构建和安装的子模块,其中之一是 netcdf。我的程序只依赖于 netcdf 包。
  • 如果 netcdf 包真的是 SNAPSHOT 如果是,你有正确的版本吗?此外,您如何运行代码?
  • 我在帖子底部添加了编辑以解决您的最后 2 个问题。
  • 嗯。您能否发布整个错误消息,特别是 ClassNotFoundException 部分...可能是在错误的方向搜索。

标签: java maven dependencies


【解决方案1】:

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

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>

然后你可以在你的classpath arg中使用maven程序集创建的输出jar

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      如果您使用简单的 java 命令来运行您的应用程序,您必须将您的项目依赖的所有其他 jar 文件提供给 -classpath(或 -cp)开关(或通过 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>
      

      【讨论】:

      • 我编辑了我的帖子。我添加了 netcdf jar,但是有传递依赖。我希望自动解决这些问题。
      • @Noah。如果您使用create-executable-jar 程序集,所有传递依赖项都将添加到生成的 jar 中。
      • @khmarbaise。正如我在帖子中所说,这是本书的逐字副本。
      【解决方案4】:

      如果你想在classpath中拥有所有依赖,在运行你的jar时,你可以使用maven-exec-plugin从withing maven运行程序,并且所有依赖都自动添加到你的classpath中。

      【讨论】:

      • 你有这方面的例子吗?
      【解决方案5】:

      您缺少以下依赖项:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 2017-01-06
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多