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