我创建了一个Plexus组件来容纳我想要创建的几个Mojos的通用逻辑.我已经能够localRepository
从Mojo(和测试用例)传递信息和项目.
我想知道是否有办法从组件中获取MavenSession
或MavenExecutionRequest
从组件中传递它们作为Mojo的参数.我知道我的组件将从Maven Mojo运行.
我在这个例子中使用Maven 2.
有人可以向我解释一下Plexus是什么http://plexus.codehaus.org/?
它与Maven有什么关系?
我已经搜索了谷歌并在StackOverflow上查看了答案,但似乎无法解决这个问题.我最近加入了这个项目并为POM添加了一些东西.作为Maven的相对新手,我没有理解这个问题,我所看到的反应并没有得到澄清.我怀疑这是Groovy添加到项目中.我想使用Groovy和Spock进行测试(并且希望最终也能用于测试).
[INFO] Using Groovy-Eclipse compiler to compile both Java and Groovy files
[FATAL ERROR] org.apache.maven.plugin.CompilerMojo#execute() caused a linkage error (java.lang.NoSuchMethodError) and may be out-of-date. Check the realms:
[FATAL ERROR] Plugin realm = app0.child-container[org.apache.maven.plugins:maven-compiler-plugin:2.0.2]
urls[0] = file:/C:/Users/bill.turner/.m2/repository/org/apache/maven/plugins/maven-compiler-plugin/2.0.2/maven-compiler-plugin-2.0.2.jar
urls[1] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/groovy/groovy-eclipse-compiler/2.7.0-01/groovy-eclipse-compiler-2.7.0-01.jar
urls[2] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/groovy/groovy-eclipse-batch/2.0.4-02/groovy-eclipse-batch-2.0.4-02.jar
urls[3] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/plexus/plexus-compiler-api/1.5.3/plexus-compiler-api-1.5.3.jar
urls[4] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar
urls[5] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/plexus/plexus-compiler-manager/1.5.3/plexus-compiler-manager-1.5.3.jar
urls[6] = file:/C:/Users/bill.turner/.m2/repository/org/codehaus/plexus/plexus-compiler-javac/1.5.3/plexus-compiler-javac-1.5.3.jar
[FATAL ERROR] Container realm = plexus.core
urls[0] = file:/C:/Users/bill.turner/apache-maven-2.2.1/lib/maven-2.2.1-uber.jar
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] org.codehaus.plexus.compiler.CompilerConfiguration.getDebugLevel()Ljava/lang/String;
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NoSuchMethodError: org.codehaus.plexus.compiler.CompilerConfiguration.getDebugLevel()Ljava/lang/String;
at org.codehaus.groovy.eclipse.compiler.GroovyEclipseCompiler.createCommandLine(GroovyEclipseCompiler.java:343) …
Run Code Online (Sandbox Code Playgroud) 我需要用我自己的实现替换一些 Maven 默认功能,我正在寻找一种干净的方法来做到这一点。
我已经org.apache.maven.repository.internal.DefaultVersionRangeResolver
使用 component.xml扩展并注册了我的扩展组件,如下所示:
<component-set>
<components>
<component>
<role>org.sonatype.aether.impl.VersionRangeResolver</role>
<role-hint>default</role-hint>
<implementation>com.my.custom.VersionRangeResolver
</implementation>
<isolated-realm>false</isolated-realm>
<requirements>
<requirement>
<role>org.sonatype.aether.spi.log.Logger</role>
<role-hint />
<field-name>logger</field-name>
</requirement>
<requirement>
<role>org.sonatype.aether.spi.log.Logger</role>
<role-hint />
<field-name>logger2</field-name>
</requirement>
<requirement>
<role>org.sonatype.aether.impl.MetadataResolver</role>
<role-hint />
<field-name>metadataResolver</field-name>
</requirement>
</requirements>
</component>
</components>
</component-set>
Run Code Online (Sandbox Code Playgroud)
我已经在我的本地 repo 中安装了包含它的项目,我在另一个项目的 pom.xml 中像这样引用它:
<build>
<extensions>
<extension>
<groupId>my.groupId</groupId>
<artifactId>maven-version-resolver</artifactId>
<version>SNAPSHOT</version>
</extension>
</extensions>
</build>
Run Code Online (Sandbox Code Playgroud)
但是,我的神器没有使用。当我在构建中运行这个小的 GMaven groovy 脚本时:
session.container.getComponentDescriptorList(
'org.sonatype.aether.impl.VersionRangeResolver'
).each{
println "Role Hint: ${it.roleHint}, implementation: ${it.implementation}" ;
}
Run Code Online (Sandbox Code Playgroud)
它向我展示了默认实现和我自己的实现,都带有“默认”提示。那么我该如何解决这个问题呢?
谁能解释一下plexus-classworlds和(普通)classworlds之间的区别?
这两个令人困惑,看不出差异.Plexus classworlds几乎没有描述.显然,基于maven的Java项目使用两者,我不明白为什么.
有没有可能用plexus-classworld取代classworlds而没有太多麻烦?
我发现我的Maven版本在scm标记阶段失败,在发布插件中有明显的无限递归:
... (hundreds more times)
at org.codehaus.plexus.util.DirectoryScanner.scandir(DirectoryScanner.java:491)
at org.codehaus.plexus.util.DirectoryScanner.scandir(DirectoryScanner.java:491)
at org.codehaus.plexus.util.DirectoryScanner.scandir(DirectoryScanner.java:491)
at org.codehaus.plexus.util.DirectoryScanner.scandir(DirectoryScanner.java:491)
at org.codehaus.plexus.util.DirectoryScanner.scan(DirectoryScanner.java:346)
at org.codehaus.plexus.util.FileUtils.getFileAndDirectoryNames(FileUtils.java:1886)
at org.codehaus.plexus.util.FileUtils.getFileNames(FileUtils.java:1813)
at org.codehaus.plexus.util.FileUtils.getFileNames(FileUtils.java:1795)
at org.codehaus.plexus.util.FileUtils.getFiles(FileUtils.java:1769)
at org.apache.maven.scm.provider.svn.svnexe.command.tag.SvnTagCommand.executeTagCommand(SvnTagCommand.java:172)
at org.apache.maven.scm.command.tag.AbstractTagCommand.executeCommand(AbstractTagCommand.java:81)
at org.apache.maven.scm.command.AbstractCommand.execute(AbstractCommand.java:59)
at org.apache.maven.scm.provider.svn.AbstractSvnScmProvider.executeCommand(AbstractSvnScmProvider.java:388)
at org.apache.maven.scm.provider.svn.AbstractSvnScmProvider.tag(AbstractSvnScmProvider.java:368)
at org.apache.maven.scm.provider.AbstractScmProvider.tag(AbstractScmProvider.java:846)
at org.apache.maven.shared.release.phase.ScmTagPhase.execute(ScmTagPhase.java:127)
...
Run Code Online (Sandbox Code Playgroud)
这个构建看起来还不错:
[INFO] Working directory: /Users/srowen/Documents/Development/ZXing
[INFO] Tagging release with the label zxing-2.2...
[INFO] Executing: /bin/sh -c cd /Users/srowen/Documents/Development/ZXing && svn --non-interactive copy --file /var/folders/tx/g74p23497xz89k7ngn6_6ykr0000gn/T/maven-scm-1363236967.commit --revision 2758 https://zxing.googlecode.com/svn/trunk https://zxing.googlecode.com/svn/tags/zxing-2.2
[INFO] Working directory: /Users/srowen/Documents/Development/ZXing
Run Code Online (Sandbox Code Playgroud)
有没有人见过这样的东西?它是否响铃可能暗示一些本地问题?没有符号链接,这里没有涉及特别深的目录结构.
我有以下简化示例涉及丛集容器:
package de.vogel612.depanalyzer;
import de.vogel612.depanalyzer.dependency.MavenResolutionTaskReal;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.repository.layout.FlatRepositoryLayout;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.impl.RemoteRepositoryManager;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.transport.file.FileTransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
public class MCVE {
private static final ServiceLocator serviceLocator = MavenRepositorySystemUtils.newServiceLocator()
.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class)
.addService(TransporterFactory.class, FileTransporterFactory.class)
.addService(TransporterFactory.class, HttpTransporterFactory.class);
private static final PriorityBlockingQueue<ResolutionTask> taskQueue = new PriorityBlockingQueue<>();
private static final ExecutorService consumer = Executors.newSingleThreadExector();
// actually initialized in main, since number of threads is configurable
private static ExecutorService workers …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试让 PlexusContainer 在Maven
maven 或 eclipse 执行上下文之外为我提供一个初始化的实例。
为此,我有以下代码(简化):
PlexusContainer container = null;
try {
container = new DefaultPlexusContainer();
container.lookup(MavenResolutionTask.class).run();
container.dispose();
} catch (Exception e) {
e.printStackTrace();
}
// --- MavenResolutionTask.java:
@Component(role = MavenResolutionTask.class)
// ResolutionTask is an abstract class
// implementing Runnable and extending CompletableFuture
public class MavenResolutionTask extends ResolutionTask {
@Requirement
private Maven maven;
}
Run Code Online (Sandbox Code Playgroud)
鉴于我plexus-component-metadata:process-classes
在 pom.xml 中有标准的插件执行,如果它像这样工作,我会很喜欢的。
不幸的是,运行此代码会导致 LookupException,原因如下(为简洁起见,省略了堆栈跟踪):
WARN Sisu - Error injecting: org.apache.maven.project.DefaultProjectBuildingHelper
com.google.inject.ProvisionException: Guice provision errors:
1) No implementation for org.apache.maven.repository.RepositorySystem was …
Run Code Online (Sandbox Code Playgroud)