当前位置: 首页 > 面试题库 >

除了其余的Maven,Maven依赖插件是否还使用其他种类的工件解析?

侯池暝
2023-03-14
问题内容

如果我使用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 将其放入存储库中 __

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-stuff<id>
            <phase>initialize</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.example</groupId>
                        <artifactId>org.example.simple.project1.</artifactId>
                        <version>[1.0,1.1)</version>
                        <type>jar</type>
                        <overWrite>true</overWrite>
                        <outputDirectory>target/stuff</outputDirectory>
                        <includes>**/*.*</includes>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

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

相反,我得到以下异常:

[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] ------------------------------------------------------------------------

问题答案:

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

解压缩和复制目标必须复制一些核心解决方案代码。不幸的是,该解析代码并非真正采用api形式。因此,这些目标无法处理版本范围,也无法直接在反应堆中解决工件(坦率地说,我从未实施过它们,因为它破坏了太多现有用例,是的,解析代码是如此糟糕)

更好的方法是使用这些目标的xxx依赖性形式。这些目标要求Maven在调用它们之前进行解决,因此它是100%兼容的。您可以使用groupId和artifactId过滤器之类的过滤器来有效地获取所需的工件列表,最终结果将相同。

复制和解压缩绝对更加灵活,旨在用于我当时使用的更简单的用例。知道了我现在所知道的,我可能会更像是从xxx-dependencies表单开始实现它。

综上所述,在Maven
3中,解析代码最终完全解耦了……依赖插件驱动了大多数所需的用例。我将开始开发新版本的插件,以尽快充分利用此功能……虽然它需要maven
3,但最终可以实现所有目标的100%。



 类似资料:
  • 我有两个Maven(GWT)项目,其中一个应该依赖于另一个。我只是添加了依赖项,比如: 这些类被正确引用,我可以在我的其他项目中使用它们。但如果我想触发maven构建,它会抱怨:“无法解析项目的依赖项:找不到工件myGroup:MyArtifact:jar:1.0-SNAPSHOT” 该项目没有jar,因为它是一个GWT Web应用程序。它有一个“战争”档案。我测试了一下论点,尝试了“pom”或“

  • 原因是什么? (注意,我提出这个问题是为了记录jOOQ commercial edition在这里关于堆栈溢出的特定答案,因为这是来自用户的一个常见支持请求,而且堆栈溢出会助长这种情况)。

  • 我是否遗漏了一些应该用来配置antlr4的命令?

  • 我有一个具有以下依赖结构的gradle项目: 这是由Jersey和ASM4.1之间的不兼容性引起的(Jersey使用3.3.1,它具有不同的组id),这是从另一个模块提取的传递依赖项。 顺便说一句,我知道Idea13有更好的Gradle集成,但是(a)我们有12的许可证,而且不会很快升级整个开发团队;(b)Idea13在多语Gradle项目(Java/Scala)方面仍然存在一些问题,所以它不符合

  • BFA插件似乎仍然使用jackson2-api插件中的jackson类,而不是直接依赖maven。导致https://issues.jenkins-ci.org/browse/jenkins-62214在MongoJack内部的导入中使用了错误的jackson版本,导致缺少方法: Jenkins的类路径中Jackson2-api插件的依赖性是否更高?

  • 最近,我发现了以下问题: 当我为我的项目设置依赖项管理时,我有一个child-pom,它使用具有依赖项的插件,我想要与在我的依赖项管理中声明的依赖项同步。 在根pom中,我在依赖项管理中声明: 在子pom中,我有一个插件需要gwt-user: 但是,如果我移除gwt-maven-plugin中使用的依赖版本,编译就会失败。 是不是还有别的办法可以实现呢? PS:在maven和maven插件中有一个