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

在Maven依赖的上下文中,我如何理解类路径及其对执行的影响?

长孙智刚
2023-03-14

我明白。。。

  1. 在Java中,类路径是JVM在编译过程中定位使用过的类、包和其他资源所需的环境变量
  2. 在Maven中,阶段是构成Maven构建生命周期的过程
  3. 在Maven中,依赖项的依赖项被称为可传递依赖项
  4. 在Maven中,依赖项的作用域“指的是手头任务的类路径,并设置依赖项的可传递性”

我真的不明白第三句话的意思。是范围定义了依赖项可用的类路径吗?

更重要的是,...

  1. 如何将依赖项的作用域(类路径)与其传递性联系起来
  2. 如何将依赖项的范围(类路径)与项目的阶段及其执行联系起来

共有1个答案

从景曜
2023-03-14

首先Java可以定义环境变量CLASSPATH,但也可以使用命令行选项java-cp...

通常有两个作用域compiletest。如果没有定义范围,编译范围是默认使用的范围。它通常定义构建部件(编译!)所需的依赖项用于生产代码src/main/java)。

test范围定义了仅用于运行/编译测试的依赖项。

这意味着在使用Maven构建时,有两个不同的类路径,一个用于生产代码,另一个用于测试。如果您通过mvn verify-X构建并深入查看调试输出,您可以看到以下不同部分:

[DEBUG] test classpath:  /Users/khm/ws-git-soebes/katas/fraction/target/test-classes
/Users/khm/ws-git-soebes/katas/fraction/target/classes  
/Users/khm/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar  
/Users/khm/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2.jar  

第一个条目包含target/test类,这意味着src/test/java目录中的所有内容都位于测试类路径的第一位。之后您将看到target/class,其中包含生产代码(src/main/java),之后您将看到apigardian-api-1.1.2。jar编译范围依赖项,之后您将看到所有测试范围依赖项。

您还可以看到编译生产代码的输出如下所示:

[DEBUG] Classpath:
[DEBUG]  /Users/khm/ws-git-soebes/katas/fraction/target/classes
[DEBUG]  /Users/khm/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
[DEBUG] Source roots:
[DEBUG]  /Users/khm/ws-git-soebes/katas/fraction/src/main/java
[DEBUG]  /Users/khm/ws-git-soebes/katas/fraction/target/generated-sources/annotations
[DEBUG] Command line options:
[DEBUG] -d /Users/khm/ws-git-soebes/katas/fraction/target/classes -classpath /Users/khm/ws-git-soebes/katas/fraction/target/classes:/Users/khm/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar: -sourcepath /Users/khm/ws-git-soebes/katas/fraction/src/main/java:/Users/khm/ws-git-soebes/katas/fraction/target/generated-sources/annotations: -s /Users/khm/ws-git-soebes/katas/fraction/target/generated-sources/annotations -g -nowarn --release 11 -encoding UTF-8 -Xlint:deprecation -Xlint:unchecked

这显示了target/classes,其中包含从src/main/java和条目apigardian-api-1.1.2编译的您自己部分的类。jar这是一个依赖范围:编译apigardian-api-1.1.2.jar)。

因此,范围定义了可以在哪里看到依赖项(或者更准确地使用)。

如何将依赖项的作用域(类路径)与其传递性联系起来?

您自己项目的编译范围依赖关系将被传播到使用您项目的另一个项目。矛盾的测试范围依赖不会传播到其他项目。

更多详细信息请参见pom解释

如何将依赖项的范围(类路径)与项目的阶段及其执行联系起来?

通常编译作用域与编译阶段相关(当然是测试),test作用域与测试阶段相关(通过maven-surefire-plugin进行的单元测试或通过maven-故障安全-plugin进行的集成测试)。

 类似资料:
  • 我刚开始学习spring,我想使用4.0.4。发布版本——它实际上是maven repository提供的最新版本,所以我的问题是:如果我像这样添加依赖项: -它会自动将所有“基本”模块(如context、core、aop、beans、expression)添加到我的项目中,但例如,如果我像这样添加依赖项: -它只会将spring core jar文件添加到我的项目中,有人能解释一下为什么会这样吗

  • 我有一个名为.jar的罐子,它依赖于我的外部库。 执行会得到以下输出, 我尝试用两种方式运行jar 并为DependedClass获得了NoClassDefFoundError 按如下所示更改清单条目后 清单-版本:1.0 创建-由:1.6.0_05(Sun Microsystems Inc.) 主-类:com.os.hw.helloworld 类-路径:c://users/vinay/deskt

  • 上一章介绍了类型类的概念,这种模式使设计出来的程序既拥抱扩展性,又不放弃具体的类型信息。 这一章,我们还将继续探究 Scala 的类型系统,讲讲另一个特性, 这个特性可以将 Scala 与其他主流编程语言区分开:依赖类型,特别是,路径依赖的类型和依赖方法类型。 一个广泛用于反对静态类型的论点是 “the compiler is just in the way”, 最终得到的都是数据,为什么还要建立

  • 本文向大家介绍说说你对执行上下文的理解相关面试题,主要包含被问及说说你对执行上下文的理解时的应答技巧和注意事项,需要的朋友参考一下 执行上下文相当于当前代码的一个运行环境。 一般执行上下文会以栈的形式在执行栈中存储。 栈顶的执行环境可以访问到整个栈中的变量。

  • 在项目A中,我有POJO和DAO。在项目B中,所有的业务规则、控制器、sping配置等等。 我已经按照这里的建议成功地将项目A链接到B。 src/main/webapp/web-inf/spring/smartquality-datasource.xml是: src/main/webapp/web-inf/spring/smartqualite-security.xml是: serc/main/w

  • 我在目标目录和lib目录中创建了executable.jar,所有依赖项jar都位于/lib Directoty下。 这是我的pom.xml的代码片段。我应该更改什么?