标签: aether

如何在插件中访问Maven的依赖关系层次结构

在我的插件中,我需要处理依赖关系层次结构并获取有关每个依赖关系的信息(groupId,artifactId,version等)以及它是否被排除.做这个的最好方式是什么?

maven-plugin maven maven-dependency-plugin aether

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

java.lang.ClassNotFoundException:org.sonatype.aether.version.InvalidVersionSpecificationException

我正在使用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-plugin maven-3 aether

18
推荐指数
2
解决办法
2万
查看次数

以编程方式获取Maven工件

我正在寻找一个可用于从远程存储库中检索Maven工件的Java API.到目前为止我找到了Eclipse Ather,但它看起来很复杂,因此我需要更简单的东西.

我需要的是:

  • 我必须指定远程Maven存储库的位置
  • 我喜欢根据它的groupId + artifactId +版本获取工件
  • API必须提供工件的当前远程版本(考虑定期构建的SNAPSHOT工件,以便它们在其版本中具有生成的部分)
  • 返回工件的位置,首选HTTP URL(我将使用例如Apache HTTP Client自己获取它)
  • 可选地,检索作为所请求的工件的依赖的工件.

java api dependencies maven aether

12
推荐指数
1
解决办法
7508
查看次数

以编程方式解析插件之外的Maven依赖关系 - 获取RepositorySystemSession和RepositorySystem

也许这将是一个比我原先想象的更大的任务,但无论如何,我正在尝试MavenProject从文件加载一个文件,然后解决它的依赖关系.我有两个位的代码,但我缺少一些我需要的对象引用; 特别是我需要得到RepositorySystemSession和的实例 RepositorySystem.有小费吗?

注意:我用标记了这个问题,但这不是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)

java maven-plugin maven aether

12
推荐指数
2
解决办法
2万
查看次数

依赖Aether的maven mojo能否兼容Maven 3.0.x和3.1.x?

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-plugin maven-3 maven aether

9
推荐指数
1
解决办法
2709
查看次数

如何从Maven 3.0插件获取本地存储库位置?

如何从Maven 3.x插件中获取本地存储库位置(URI)?

java maven-3 maven aether

8
推荐指数
1
解决办法
2694
查看次数

在maven-plugin-testing-harness中注入DefaultRepositorySystem时出错

我正在尝试基于现有的(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-plugin maven aether

8
推荐指数
1
解决办法
2138
查看次数

如何在maven插件中下载依赖项?

什么是从一个Maven插件内下载远程Maven构件的最佳方式,同时还支持Maven的2.2.x1) ,3.0.x, 3.1.x和更新?

Aether似乎是一个很好的候选者,但它改变了包名称空间3.0.53.1破坏兼容性

周围有很多信息,

那么正确的,或者至少是有效的方法是什么呢?

1)如同@khmarbaise所指出的那样Maven 2.2.x是一个很好的EoL

java eclipse maven-plugin maven aether

8
推荐指数
1
解决办法
243
查看次数

与Play 2.3.8的多个SLF4J绑定

我使用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的工作原理相同.

scala sbt playframework aether

8
推荐指数
1
解决办法
2038
查看次数

使用Maven Java API从存储库中检索Maven工件

如果我有Maven工件信息(GroupId,ArtifactId,Version),我如何以编程方式(使用Java)从我的本地存储库中检索该工件?

具体来说,我需要能够连接到Maven存储库并创建/检索org.apache.maven.artifact.Artifact,以便我可以检索与工件相关联的文件.

我已经研究过m2e源代码,但是MavenImpl.java(它提供了Artifact解析)比我需要的更复杂,并且很难理解与存储库的连接是如何工作的.

java api maven-plugin maven aether

7
推荐指数
1
解决办法
6764
查看次数