当前位置: 首页 > 知识库问答 >
问题:

命令行中的Maven:依赖项不起作用

司允晨
2023-03-14

我使用以下基本Maven命令生成了一个项目:

mvn archetype:generate -DgroupId=it.maven.project -DartifactId=MavenExample -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

该项目是正确创建的,我可以测试自动生成的App类,而没有任何问题的说明:

java -cp target/MavenExample-1.0-SNAPSHOT.jar:lib/* it.maven.project.App

稍后,我向POM添加了一些依赖项,获得了以下文件:

<?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>it.maven.project</groupId>
  <artifactId>MavenExample</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>MavenExample</name>
  <!-- FIXME change it to the project's website -->
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

     <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.10</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-collections4</artifactId>
      <version>4.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>



</project>

最后,为了测试起见,我修改了之前由Maven自己生成的App类:

package it.maven.project;
import org.apache.commons.lang3.RandomStringUtils;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        System.out.println("Stringa generata casualmente: " + RandomStringUtils.random(16, true, true).toUpperCase());
    }
}

一系列奇怪的事情发生了:

>

  • 即使在POM中指定了较新版本的依赖项,但在.m2文件夹中,下载的版本似乎较旧(例如,commons-lang3的版本为2.1和2.5)

    该项目按指令正确编译

    MVN clean Install-u

    当我再次运行命令执行App时,我得到以下异常:

    线程“main”java.lang.noClassDeffounder中出现异常错误:org/apache/commons/lang3/randomstringutils at it.maven.project.app.main(app.java:13)原因:java.lang.ClassNotFoundexception:org/apache/commons/lang3/randomstringutils at java.net.urlClassLoader.findClass(urlClassLoader.java:382)at java.lang.ClassLoader.LoadClass(classLoader.java:424)at sun.misc.launcher

    问题:

    >

  • 项目在编译时返回错误,这是怎么可能的?为什么应用程序中的导入被接受,但说明:

    system.out.println(“Stringa generata casualmente:”+randomstringutils.random(16,true,true).ToupperCase());

    生成异常?

    我应该更正/执行什么以允许我的程序工作和正确使用依赖项?

  • 共有1个答案

    蓬化
    2023-03-14

    当您创建一个简单的Java项目时,您在pom中定义了一组依赖项,但是如果您没有创建一个Java存档文件(ejb-jar或war),那么如果您运行在目标目录中编译的jar,那么所有的依赖项在运行时都是不可用的。有两种解决方案:

    >

  • 创建一个uber jar,在jar中包含所有依赖项:使用stackoverflow解决方案

    从命令行运行jar时,必须将依赖项添加到类路径:

    Java-cp“/path/dependencies/dep1.jar;/path/dependencies/dep2.jar”-jar myapp.jar

  •  类似资料:
    • 我创建了一个基于Maven的spring引导项目来探索如何使其在Websphere Application Server上运行。这是我需要排除spring-boot-starter-web的嵌入式Tomcat的方法。 我试过以下几件事: 为spring-boot-starter-tomcat添加了一个新的依赖项,其作用域为:provided(请参见在部署到JBOSS[spring-boot])时从

    • 我有一个包含以下文件的Java项目: C:\MyProject\myPackage\MyTests.class C:\MyProject\lib\junit-platform-console-standalone-1.5.2.jar C:\MyProject\lib\other-library.jar MyTests 文件是使用 IDE 编译的,该 IDE 具有 junit-platform-co

    • 在我的另一个工作区,对于我现有的项目,我没有这个问题。 有办法解决吗?

    • 我有一个使用Spring的项目。它使用的是3.1.1版本,但是,由于某些原因,我真的不知道,有些spring工件与两个不同的版本是重复的。我在项目中的所有pom.xml文件中查找这些依赖项。我还使用dependecy插件来找出那些依赖项包含在哪里。 这里有输出的提取 据我所知,这意味着包含在中。 更新:似乎当我评论下一段代码时,罐子不包括在战争中。

    • src/main/resources/application.yml 来自Spring文档: 创建一个名为application.yml的文件并将其放在类路径的根目录中,还将snakeyaml添加到依赖项中(如果使用spring-boot-starter,Maven坐标org.yaml:snakeyaml已经包含在内)。 在这个问题上有人能帮我吗? pom.xml

    • 问题内容: 我需要将项目的所有传递依赖项下载到命令行上的目录, 而没有 pom.xml文件或其他脚本。理想情况下,我将可以使用一个或两个命令来执行此操作。据我所知,这至少是mvn的两步过程。 将依赖项下载到本地存储库 将依赖项复制到lib目录 为了获得我运行的依赖 哪个很棒。不幸的是,目标参数对我没有帮助,因为它不会将所有可传递的依赖项放入目标中。 因此,现在我需要将该JAR文件及其所有传递依赖项