标签: transitive-dependency

冻结对maven版本的传递依赖性,以使构建完全可重现

与基本maven概念相关的问题:

一旦发布,我希望保证项目构建完全可重现.因此,所有项目和插件依赖项(包括可传递的依赖项)应始终以相同的方式解析.

不幸的是,如果依赖关系以版本范围表示,则情况并非如此.即使设置了项目的直接依赖关系(使用版本:use-releases),也可能发生传递依赖关系仍然可以在将来以其他方式解决.

如何解决这个问题?有没有已知的解决方案?

我在思考(只是一个想法),关于创建一个插件,在发布时将把项目的所有依赖项转储到一个单独的文件,然后在将来构建之后,从文件读取的依赖项将优先于标准maven用来解决依赖关系的方式.但我担心没有插件api.所以它需要一些黑客攻击,我想避免.还有另外一种方法吗?

谢谢,卢卡斯

dependencies release maven maven-release-plugin transitive-dependency

5
推荐指数
1
解决办法
504
查看次数

maven - 传递依赖

我在pom.xml中定义数据时尝试遵循最佳实践,所以我开始研究Spring源代码,我看到:


<project xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <packaging>jar</packaging>
  <version>3.1.1.RELEASE</version>
.....

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
</dependency>

---

<dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <scope>test</scope>
</dependency>
-----
Run Code Online (Sandbox Code Playgroud)

但是,spring-bean也依赖于log4j.

你能告诉我,对于最佳实践方法,你应该在多大程度上依赖传递依赖?

我问这个是因为我的第一个想法是不重新声明log4j依赖,因为spring-beans已经声明了它.

maven transitive-dependency

5
推荐指数
1
解决办法
7899
查看次数

Maven eclipse插件,不包含传递依赖

关于maven和transitive依赖性排除有几个问题.但是,我没有让它运作.我的pom中有一些依赖项,重新打包了一些库,以减少pom的大小.到目前为止,这是成功的.但是当我运行mvn eclipse:eclipse这些传递依赖时,会将其写入.classpath文件.即使他们被排除在下面的摘录中.

    <dependency>
        <groupId>foo.bar</groupId>
        <artifactId>foobar</artifactId>
        <version>1.2.4</version>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

Apache Maven 3.3.3(7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13:57:37 + 02:00)

Java版本:1.7.0_45,供应商:Oracle Corporation

eclipse maven-3 transitive-dependency

5
推荐指数
1
解决办法
525
查看次数

如何解决传递依赖版本冲突(scala/sbt)

我有一个包含多个实用程序类的项目。让我们命名它Utils。我有一个proj1取决于Utils. 另一个proj2依赖于proj1Utils

问题是,如果这两个proj1proj2依赖于不同的Utils版本,这将导致一些问题。

最好的解决办法是什么?

这种情况出现在Scala/SBT项目中,但我猜其他语言也有同样的问题。

编辑:

需要明确的proj2是,将运行的项目使用来自proj1和 的一些代码Utils

dependencies scala maven sbt transitive-dependency

5
推荐指数
1
解决办法
1200
查看次数

关于 slf4j 和 logback-classic 传递依赖的明确答案

我真的很努力地将 logback-classic 的加载作为传递依赖问题。我遵循了 stackoverflow 上的建议,但是,它不断重复出现。

我使用 Maven 排除来尝试控制它,它根本没有出现在我的 pom 依赖关系层次结构中。但它仍然被加载!

这是我的运行时跟踪

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/david/.m2/repository/de/ruedigermoeller/kontraktor-http/3.33/kontraktor-http-3.33.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/david/.m2/repository/ch/qos/logback/logback-classic/1.2.1/logback-classic-1.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
W 13:22:24:837 : DispatcherThread 1 : DispatcherThread : 
java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getLoggerFactoryClassStr()Ljava/lang/String;
at org.slf4j.LoggerFactory.reportActualBinding(LoggerFactory.java:271)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:143)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
at org.quartz.impl.StdSchedulerFactory.<init>(StdSchedulerFactory.java:284)
at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:1539)
at uk.co.example.ExampleEwsService.init(ExampleEwsService.java:296)
Run Code Online (Sandbox Code Playgroud)

部分问题在于 Kontraktor 框架重写了 StaticLoggerBinder.getLoggerFactoryClassStr 方法。但很容易确保它首先被加载,然后从正在加载它的quartz中排除logback-classic,如下所示:

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId> …
Run Code Online (Sandbox Code Playgroud)

java slf4j maven transitive-dependency logback-classic

5
推荐指数
1
解决办法
1999
查看次数

Maven-对于在Artifactory上部署的工件,无法解决传递依赖性

我有两个项目-A和B,其中A依赖于B。我将B打包为jar并将其部署在maven服务器(人工工厂)上,然后将该jar作为对项目A的普通依赖项包含在pom文件中。B的jar文件显示在项目A的Maven依赖项中,但项目B的依赖项未显示在依赖项层次结构中。这导致B的依赖项的类未找到异常。

但是,我的项目A和B在同一个Eclipse工作区中。当我打开项目B时,项目A开始从工作空间而不是远程存储库中引用项目B,并且一切正常。

这个问题-Maven。传递依存关系最接近我的问题,但是项目B的依存关系不是可选的。

怎么了

项目B的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myapp</groupId> 
  <artifactId>utils</artifactId>
  <version>1.0.0-RELEASE</version>
  <packaging>jar</packaging>

  <name>utils</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

<!-- Following doesn't get added to project A -->
  <dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

项目A的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myapp</groupId>
  <artifactId>core-app</artifactId>
  <version>1.0.0-RELEASE</version>
  <packaging>jar</packaging>

  <name>core-app</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>com.myapp</groupId>
      <artifactId>utils</artifactId>
      <version>1.0.0-RELEASE</version>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

我正在使用Maven快速入门原型。我的项目的项目结构为(我打包为jar):

project-name
  src/main/java
  src/test/java
  pom.xml
Run Code Online (Sandbox Code Playgroud)

java eclipse artifactory maven transitive-dependency

5
推荐指数
1
解决办法
4090
查看次数

如何在 mvn 依赖树命令中仅列出直接依赖项?

mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:tree -DoutputFile=/tmp/dependencies.txt -DoutputType=dot -DappendOutput=true
Run Code Online (Sandbox Code Playgroud)

我使用上面的命令来获取依赖项列表,即直接依赖项和传递依赖项。我想要对上述命令进行更改,这将给我一个仅包含直接依赖项的列表,并忽略所有传递依赖项。我不想使用任何其他命令,也不想更改输出文件格式。我们的解析器依赖于输出文件格式。有人对此有任何解决方案吗?

tree dependencies command maven transitive-dependency

5
推荐指数
1
解决办法
2269
查看次数

如何在gradle任务中获取传递依赖的信息?

我想在gradle任务中获取所有依赖项(包括可传递的)的信息.

我试过这段代码:

class MyGradlePlugin implements Plugin<Project> {

  void apply(Project project) {
    project.afterEvaluate {
      println "  Project:" + project.name
      project.configurations.each { conf ->
        println "    Configuration: ${conf.name}"
        conf.allDependencies.each { dep ->
          println "      ${dep.group}:${dep.name}:${dep.version}"
        }
      }
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

但它只打印声明的,没有传递的.

这意味着,如果我dependencies是:

dependencies {
    compile "com.google.guava:guava:18.0"
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile 'junit:junit:4.11'
}
Run Code Online (Sandbox Code Playgroud)

它只打印这3个依赖项,但不显示org.hamcrest:hamcrest-core:1.3哪个是传递依赖项junit:junit:4.11.

如何修改代码让它显示org.hamcrest:hamcrest-core:1.3

PS:我知道gradle dependencies任务会显示我想要的一切,但我需要手动获取依赖项信息并以我自己的格式打印.

plugins dependencies task gradle transitive-dependency

4
推荐指数
1
解决办法
1758
查看次数

如何在 Rust 中使用传递依赖的特征?

如何在我的应用程序中使用传递依赖项箱中的特征?

这是我遇到的问题的一个最小说明示例:

在 中Cargo.toml,我有:

[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"
Run Code Online (Sandbox Code Playgroud)

我的箱子取决于rand ^0.8.5mersenne_twister ^1.1.1,它本身取决于rand >=0.3, <0.5

my-crate ---> rand 0.8.5
         |
         |
         ---> mersenne_twister 1.1.1  ----> rand >= 0.3, < 0.5
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我想使用trait rand::Rng for mersenne_twister::MT19937. 但是当我尝试将这个特征纳入范围时,它显然没有被识别:

my-crate ---> rand 0.8.5
         |
         |
         ---> mersenne_twister 1.1.1  ----> rand >= 0.3, < 0.5
Run Code Online (Sandbox Code Playgroud)

我的猜测是,Rng导入的特征use rand::Rng;来自 的特征rand 0.8.5,而不是实际实现的特征rand 0.4.6MT19937,即使它们的拼写方式相同,但它们是不同且不相关的特征,因此不能互换引用。


所以我有一些问题:

  1. 如何在我的应用程序中使用Rng …

dependencies traits rust transitive-dependency semantic-versioning

4
推荐指数
2
解决办法
74
查看次数

在 Gradle 中排除传递依赖

在通过 Gradle 构建期间,我得到了这个

POM relocation to an other version number is not fully supported in Gradle : xml-apis:xml-apis:2.0.2 relocated to xml-apis:x
ml-apis:1.0.b2.
Please update your dependency to directly use the correct version 'xml-apis:xml-apis:1.0.b2'.
Resolution will only pick dependencies of the relocated element. Artifacts and other metadata will be ignored.
Run Code Online (Sandbox Code Playgroud)

项目中使用了蜡染 1.7。此版本的 Batik 使用 Xalan 2.6.0,它依赖于已重新定位的 xml-apis 2.0.2。

如何解决这种传递依赖?

gradle transitive-dependency build.gradle

3
推荐指数
1
解决办法
1万
查看次数