与基本maven概念相关的问题:
一旦发布,我希望保证项目构建完全可重现.因此,所有项目和插件依赖项(包括可传递的依赖项)应始终以相同的方式解析.
不幸的是,如果依赖关系以版本范围表示,则情况并非如此.即使设置了项目的直接依赖关系(使用版本:use-releases),也可能发生传递依赖关系仍然可以在将来以其他方式解决.
如何解决这个问题?有没有已知的解决方案?
我在思考(只是一个想法),关于创建一个插件,在发布时将把项目的所有依赖项转储到一个单独的文件,然后在将来构建之后,从文件读取的依赖项将优先于标准maven用来解决依赖关系的方式.但我担心没有插件api.所以它需要一些黑客攻击,我想避免.还有另外一种方法吗?
谢谢,卢卡斯
dependencies release maven maven-release-plugin transitive-dependency
我在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依赖性排除有几个问题.但是,我没有让它运作.我的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
我有一个包含多个实用程序类的项目。让我们命名它Utils。我有一个proj1取决于Utils. 另一个proj2依赖于proj1和Utils。
问题是,如果这两个proj1和proj2依赖于不同的Utils版本,这将导致一些问题。
最好的解决办法是什么?
这种情况出现在Scala/SBT项目中,但我猜其他语言也有同样的问题。
编辑:
需要明确的
proj2是,将运行的项目使用来自proj1和 的一些代码Utils。
我真的很努力地将 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) 我有两个项目-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) 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)
我使用上面的命令来获取依赖项列表,即直接依赖项和传递依赖项。我想要对上述命令进行更改,这将给我一个仅包含直接依赖项的列表,并忽略所有传递依赖项。我不想使用任何其他命令,也不想更改输出文件格式。我们的解析器依赖于输出文件格式。有人对此有任何解决方案吗?
我想在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任务会显示我想要的一切,但我需要手动获取依赖项信息并以我自己的格式打印.
如何在我的应用程序中使用传递依赖项箱中的特征?
这是我遇到的问题的一个最小说明示例:
在 中Cargo.toml,我有:
[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"
Run Code Online (Sandbox Code Playgroud)
我的箱子取决于rand ^0.8.5和mersenne_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,即使它们的拼写方式相同,但它们是不同且不相关的特征,因此不能互换引用。
所以我有一些问题:
Rng …dependencies traits rust transitive-dependency semantic-versioning
在通过 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。
如何解决这种传递依赖?