Maven-将类添加为依赖项后导入类

时间:2019-04-18 11:02:02

标签: java maven

我正在尝试使用(导入)由我的项目的依赖项添加的类。 我在pom.xml中添加了依赖项gson,如下所示:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

然后我跑了mvn install。 现在,我可以在C:\Users\%Name%\.m2\repository\com\google\code\gson\gson\2.8.5中找到jar依赖项,因此我假设它已正确安装。

当我尝试用Java导入类Gson时,会发生一些问题:

  • 导入路径不是com.google.code.gson,而是com.google.gson,我不明白为什么。
  • 当我使用mvn软件包进行编译时,一切运行顺利。但是,如果我尝试使用java -cp .\target\testJSON-1.0-SNAPSHOT.jar json.App运行代码,则会收到以下错误,告诉我未找到Gson类:

    Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson at json.App.main(App.java:13) Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more

现在通过寻找解决方案,我的理解是: 虽然maven知道项目的依赖项,但是java不会。而且我需要手动将jar添加到类路径中。

所以我的问题是:

  • 如果我要告诉Maven我需要gson来运行我的项目,为什么我需要手动包含所有依赖项才能运行它?有没有一种方法可以以简单直观的方式自动执行此操作?
  • 当我寻找将多个jars添加到类路径的方法时,我发现的唯一答案是假设所有jars都位于同一文件夹中,因此建议执行java -cp folder/*.jar。由Maven生成的jar位于我项目的目标子文件夹中,而gson jar位于.m2文件夹中。如何将多个jar(位于不同位置)添加到类路径?

谢谢

2 个答案:

答案 0 :(得分:3)

  

导入路径不是com.google.code.gson

Google Code在2016年被关闭,他们更改了组ID。

  

找不到Gson类

GSON JAR不在类路径上。

  

如果我要告诉Maven我需要gson来运行我的项目,为什么我需要   手动包括所有依赖项来运行吗?有没有办法   以简单直观的方式自动执行此操作?

Maven是一个构建工具,它已经成功构建了您的应用程序。 Java 要求您在类路径中包括JAR。这不是Maven的不足。如果要将所有依赖项捆绑到一个“可以运行”的JAR中,请create a fat JAR

  

如何将多个jar(位于不同位置)添加到   类路径?

如果创建胖JAR,则不必这样做,但是可以像这样(OS-specific)分隔类路径条目:

java -cp folder/*.jar;another/folder/*.jar

答案 1 :(得分:1)

在使用maven创建jar时,您可能需要包括依赖项。您可以使用maven-assembly插件,

 <build>
    <plugins>
      <!-- any other plugins -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>