maven-dependency-plugin是否比其他maven使用其他类型的工件解析?

如果我使用maven-dependency-plugin插件,那么我就无法使用版本范围。 此外,虽然较新版本在远程存储库中,但似乎未定义工件的版本。

为什么会这样?

使用maven-dependency-plugin除了maven的其他部分之外的其他一些机制来解决依赖关系? 如果是这样的话,为什么呢?

这是一个例子:

我创建了一个项目org.example:org.example.simple.project1:jar并使用版本1.0.0-SNAPSHOT,1.0.0,1.0.11.1.0-SNAPSHOT将它放入存储库

我现在已经按以下方式配置了依赖插件:

 org.apache.maven.plugins maven-dependency-plugin   unpack-stuff initialize  unpack     org.example org.example.simple.project1. [1.0,1.1) jar true target/stuff **/*.*       

如果依赖关系解析与其他依赖关系相同,那么版本应该(至少在我看来)解析为1.0.1

相反,我得到以下exception:

 [ERROR] FATAL ERROR [INFO] ------------------------------------------------------------------------ [INFO] version was null for org.example:org.example.simple.project1. [INFO] ------------------------------------------------------------------------ [INFO] Trace java.lang.NullPointerException: version was null for org.example:org.example.simple.project1. at org.apache.maven.artifact.DefaultArtifact.getBaseVersion(DefaultArtifact.java:362) at org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout.pathOf(DefaultRepositoryLayout.java:47) at org.apache.maven.artifact.repository.DefaultArtifactRepository.pathOf(DefaultArtifactRepository.java:110) at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:125) at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:74) at org.apache.maven.plugin.dependency.fromConfiguration.AbstractFromConfigurationMojo.getArtifact(AbstractFromConfigurationMojo.java:242) at org.apache.maven.plugin.dependency.fromConfiguration.AbstractFromConfigurationMojo.getProcessedArtifactItems(AbstractFromConfigurationMojo.java:143) at org.apache.maven.plugin.dependency.fromConfiguration.UnpackMojo.getProcessedArtifactItems(UnpackMojo.java:138) at org.apache.maven.plugin.dependency.fromConfiguration.UnpackMojo.execute(UnpackMojo.java:88) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:453) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:559) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:500) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:479) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:331) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:292) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:142) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:336) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129) at org.apache.maven.cli.MavenCli.main(MavenCli.java:301) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) at org.codehaus.classworlds.Launcher.main(Launcher.java:375) [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4 seconds [INFO] Finished at: Mon Aug 03 17:21:41 CEST 2009 [INFO] Final Memory: 13M/133M [INFO] ------------------------------------------------------------------------ 

好的,这是真正的答案(我编写了依赖插件):

解包和复制目标必须复制一些核心解析代码。 不幸的是,解决方案代码实际上并不是一种可用的forms。 因此,这些目标不能处理版本范围,也不能直接从反应堆中解析工件(坦率地说,我从未实现它们,因为它打破了太多现有的用例,是核心解决方案代码那么糟糕)

更好的方法是使用这些目标的xxx依赖forms。 这些目标要求Maven在调用之前执行解决方案,因此它是100%兼容的。 您可以使用像groupId和artifactIdfilter这样的filter来有效地获取所需的工件列表,最终结果将是相同的。

复制和解压缩肯定更灵活,旨在用于我当时使用的更简单的用例。 知道我现在所知道的,我可能会更喜欢xxx-dependencies表单来实现它。

总而言之,在Maven 3中,解析代码最终完全解耦…依赖插件驱动了大部分用例。 我将开始研究新版本的插件,以便尽快充分利用它……虽然它需要maven 3,但它最终将100%完成所有目标。

依赖插件使用与其他所有内容相同的解析机制。 可能是您的存储库未更新元数据,因为它设置为neverweekly或其他内容。 您可以通过使用-U运行来强制Maven刷新所有远程存储库元数据。

如果目标中已存在依赖项插件,则依赖性插件也不会覆盖下载的依赖项。 您可以执行清理或配置目标以强制覆盖。 您可以将三个参数设置为true: overWriteIfNeweroverWriteReleasesoverWriteSnapshots 。 有关详细信息,请参阅文档 。

编辑:根据您更新的问题,问题是您正在使用依赖范围。 只要有解决版本的内容(例如,您在父项目或依赖项部分中定义了版本),范围就可以了。 如果您将范围更改为精确版本,或使用其中一个LATEST或RELEASE关键字 ,Maven将能够解析版本号(但请注意,这些关键字会带来风险。

我建议在父级中使用您使用的版本定义dependencyManagement部分,然后您的项目可以inheritance这些版本。 我最近回答了另一个问题,如果我发现它,我会发布一个链接

依赖性范围的问题是您没有指定您使用的某个版本。 如果您将范围指定为[1.0.0,1.1.0-SNAPSHOT],那么它可能会按预期执行。 你不能假设1.0和1.1将解析为1.0。*和1.1。*这是你似乎暗示的。

从版本3.0.0开始,maven-dependency-plugin现在支持这种开箱即用。 致谢并感谢Brian_Fox