在我的插件中,我需要处理依赖关系层次结构并获取有关每个依赖关系的信息(groupId,artifactId,version等)以及它是否被排除.做这个的最好方式是什么?
我正在使用maven索引器从maven中央存储库中获取maven索引.自从我从org.sonatype.aether更新到org.eclipse.aether并从maven 3.0.5更新到maven 3.1.0后,我得到了这个例外.
Caused by: java.lang.ClassNotFoundException: org.sonatype.aether.version.InvalidVersionSpecificationException
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
Run Code Online (Sandbox Code Playgroud)
Maven告诉我,我应该看看这个页面:http://cwiki.apache.org/confluence/display/MAVEN/AetherClassNotFound.做过某事.但是在页面上他们只是说他们知道这个问题并且他们更新了一些maven插件以便与maven 3.1.0一起运行.但他们没有说出问题是什么以及如何解决.这不是很有用.我必须改变以使我自己的插件与maven 3.1.0一起工作???
我仔细检查了我的依赖关系:
mvn dependency:tree
Run Code Online (Sandbox Code Playgroud)
似乎旧的org.sonatype.aether.aether-api.jar仍然在项目中,其中包含Exception.所以基本上org.sonatype.aether.version.InvalidVersionSpecificationException是我项目的一部分.那么为什么我会得到这个例外?
我正在寻找一个可用于从远程存储库中检索Maven工件的Java API.到目前为止我找到了Eclipse Ather,但它看起来很复杂,因此我需要更简单的东西.
我需要的是:
也许这将是一个比我原先想象的更大的任务,但无论如何,我正在尝试MavenProject从文件加载一个文件,然后解决它的依赖关系.我有两个位的代码,但我缺少一些我需要的对象引用; 特别是我需要得到RepositorySystemSession和的实例 RepositorySystem.有小费吗?
注意:我用maven-plugin标记了这个问题,但这不是Maven插件.我很高兴要求Maven 3(想想我已经有了......)
这是我到目前为止的代码:
构建MavenProject:
public static MavenProject loadProject(File pomFile) throws Exception
{
MavenProject ret = null;
MavenXpp3Reader mavenReader = new MavenXpp3Reader();
if (pomFile != null && pomFile.exists())
{
FileReader reader = null;
try
{
reader = new FileReader(pomFile);
Model model = mavenReader.read(reader);
model.setPomFile(pomFile);
ret = new MavenProject(model);
}
finally
{
// Close reader
}
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
解决依赖关系:
public static List<Dependency> getArtifactsDependencies(MavenProject project, String dependencyType, String …Run Code Online (Sandbox Code Playgroud) Maven的3.1.0版本依赖于Eclipse Aether(org.eclipse.aether)而不是Sonatype Aether(org.sonatype.aether).这似乎打破了依赖于Sonatype aether的插件的兼容性:尝试运行这样的插件,你会遇到:
java.lang.NoClassDefFoundError: org/sonatype/aether/*
Caused by: java.lang.ClassNotFoundException: org.sonatype.aether.*
Run Code Online (Sandbox Code Playgroud)
如https://cwiki.apache.org/confluence/display/MAVEN/AetherClassNotFound中所述
现在,是否有可能依赖于以太类(例如org.sonatype.aether.RepositorySystemSession)与Maven 3.0.x和Maven 3.1.x一起运行?
或者我是否必须发布同一插件的两个版本,一个用于3.0.x,另一个用于3.1.x?像这样执行强制执行规则:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.0,3.1)</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我已经在Maven开发者邮件列表上发布了这个问题,但到目前为止还没有答案......
如何从Maven 3.x插件中获取本地存储库位置(URI)?
我正在尝试基于现有的(2.0)插件创建一个新的maven(3.0.3)插件,并促进以太来拾取一些依赖.
我尝试使用maven-plugin-testing-harness(版本2.0.1)创建一个简单的测试来加载mojo,但lookupMojo失败并带有guice异常:
1) Error injecting: org.sonatype.aether.impl.internal.DefaultRepositorySystem
at ClassRealm[plexus.core, parent: null]
at ClassRealm[plexus.core, parent: null]
while locating org.sonatype.aether.RepositorySystem
while locating org.codehaus.griffon.maven.plugin.MvnValidateMojo
at ClassRealm[plexus.core, parent: null]
while locating org.apache.maven.plugin.Mojo annotated with @com.google.inject.name.Named(value=org.codehaus.griffon:griffon-maven-plugin:1.3.0-SNAPSHOT:validate)
Run Code Online (Sandbox Code Playgroud)
这当然是因为我需要在某个时候引用存储库系统,但现在不是:
@Component
private RepositorySystem repoSystem;
Run Code Online (Sandbox Code Playgroud)
我已经尝试过(实际上已经开始)版本2.1,但是在AbstractMojoTestCase #setUp()方法中遇到了问题.
org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
role: org.apache.maven.repository.RepositorySystem
roleHint:
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:247)
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,不确定我需要包括什么以及在哪里进行类似于食谱的香草mojo负载测试.有人有任何想法吗?
什么是从一个Maven插件内下载远程Maven构件的最佳方式,同时还支持Maven的2.2.x1) ,3.0.x, 3.1.x和更新?
Aether似乎是一个很好的候选者,但它改变了包名称空间3.0.5和3.1破坏兼容性
周围有很多信息,
Aether在下面使用并且可能遭受相同版本的不兼容性问题Ather根据ResolveArtifact示例手动强制您的版本那么正确的,或者至少是有效的方法是什么呢?
1)如同@khmarbaise所指出的那样Maven 2.2.x是一个很好的EoL
我使用Scala 2.11的Play Framework 2.3.8(用于Java).
我收到这个警告:
SLF4J:类路径包含多个SLF4J绑定.
SLF4J:在[jar:file:/Users/vdanylchuk/.ivy2/cache/org.slf4j/slf4j-simple/jars/slf4j-simple-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class中找到绑定]
SLF4J:在[jar:file:/Users/vdanylchuk/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar!/ org/slf4j/impl /中找到绑定StaticLoggerBinder.class]
SLF4J:有关说明,请参阅http://www.slf4j.org/codes.html#multiple_bindings.
这会在运行时以随机方式导致实际问题.在某些部署的主机上,一切顺利,日志按配置编写.在其他主机上,错误的绑定获胜,并且日志写入错误的位置.部署过程的脚本编写完全相同.所以http://www.slf4j.org/codes.html#multiple_bindings上的警告是正确的,这是随机的,所以我需要删除额外的绑定.
有趣的是,它们都来自Play框架.logback-classic(我实际上想要使用)来自play库,而slf4j-simple来自play sbt插件.
我在这里和邮件列表中阅读了很多类似的问题.示例: 如何在Play 2.3.x启动时修复"SLF4J:类路径包含多个SLF4J绑定"? 常见的解决方案是使用某种形式的排除规则.没有一个建议的解决方案适合我.[更新:事实上,他们确实如此 - 请参阅下面的解决方案.]我不希望slf4j-simple出现在最终的类路径中,但确实如此.即使我将excludeAll(ExclusionRule(organization ="org.slf4j"))添加到我的项目中的每个依赖项,除了play框架.
关于如何摆脱slf4j简单的任何想法?最好在sbt项目级别上,无需手动清理构建结果的类路径.
更新:重现说明
我用一个小的测试项目缩小了它.事实证明它是由play sbt插件和我们使用的aether-deploy插件的组合触发的.这种小配置就足够了.
build.sbt:
name := "slf4j-test"
version := "1.0"
scalaVersion := "2.11.5"
lazy val root = (project in file(".")).enablePlugins(PlayJava)
Run Code Online (Sandbox Code Playgroud)
项目/ plugins.sbt:
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.8")
addSbtPlugin("no.arktekk.sbt" % "aether-deploy" % "0.13")
Run Code Online (Sandbox Code Playgroud)
项目/ build.properties:
sbt.version=0.13.7
Run Code Online (Sandbox Code Playgroud)
然后运行"sbt test:compile"或"sbt run"(并查询localhost:9000)以查看警告.它与scala 2.10的工作原理相同.
如果我有Maven工件信息(GroupId,ArtifactId,Version),我如何以编程方式(使用Java)从我的本地存储库中检索该工件?
具体来说,我需要能够连接到Maven存储库并创建/检索org.apache.maven.artifact.Artifact,以便我可以检索与工件相关联的文件.
我已经研究过m2e源代码,但是MavenImpl.java(它提供了Artifact解析)比我需要的更复杂,并且很难理解与存储库的连接是如何工作的.
aether ×10
maven ×8
maven-plugin ×7
java ×5
maven-3 ×3
api ×2
dependencies ×1
eclipse ×1
sbt ×1
scala ×1