gpt4 book ai didi

java - 你能使用以太从 POM 获取插件配置吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:39 24 4
gpt4 key购买 nike

我需要读取 Java 中的插件配置。我已经使用 aether 库来获取运行时依赖项、编译时依赖项等。但是我可以使用 aether 来读取基于 pom 文件的插件配置吗?

类似这样的事情

<properties>
<servicePort>8080</servicePort>
<adminPort>8081</adminPort>
</properties>

<build>
<plugins>
<plugin>
<groupId>com.company.group</groupId>
<artifactId>my-plugin</artifactId>
<version>0.1-SNAPSHOT</version>
<configuration>
<myConfig>
<somePropName>someProp</somePropName>
<portMappings>
<someProp>${servicePort}</someProp>
<someProp-admin>${adminPort}</someProp-admin>
</portMappings>
</myConfig>
</configuration>
</plugin>
</plugins>
</build>

我希望能够解决

some-Prop 8080
some-prop-admin 8081

通过这个机制

目前我像这样获取编译绑定(bind)依赖项

Dependency dependency = new Dependency(new DefaultArtifact(
coordinate), COMPILE);
CollectRequest collectRequest = new CollectRequest();
collectRequest.setRoot(dependency);

collectRequest.addRepository(this.aetherSession
.getRemoteRepository());
DependencyNode node = this.aetherSession
.getRepoSystem()
.collectDependencies(this.aetherSession.getRepoSession(),
collectRequest).getRoot();
DependencyRequest dependencyRequest = new DependencyRequest();
dependencyRequest.setRoot(node);
result = this.aetherSession
.getRepoSystem()
.resolveDependencies(this.aetherSession.getRepoSession(),
dependencyRequest).getArtifactResults();
FinalResult.addAll(result);

最佳答案

我不知道是否有更简单的方法,但您可以使用 Aether API 解析您感兴趣的 POM Artifact ,然后使用 Model Builder API 从中构建 Maven 模型。

首先,如果 Artifact 的坐标不是 POM Artifact ,您需要通过创建一个具有相同 GAV 但类型为 “pom” 的新 DefaultArtifact 将它们转换为 POM Artifact 。要解决该 Artifact ,您可以调用 resolveArtifact在存储库系统上,并使用 getArtifact() 检索结果.

获得已解决的 Artifact 后,您可以使用 maven-model-builder从 Artifact 的文件构建 Maven 模型。可以使用 DefaultModelBuilderFactory.newInstance() 创建 ModelBuilder工厂方法。

对于具有父 POM 的 Artifact ,ModelResolver需要根据构建模型的请求进行设置。然而,Aether 唯一可用的实现是 DefaultModelResolver,它是 maven-aether-provider 内的包私有(private)的,因此我们需要使用 Reflection API 来构造它。它需要注入(inject)通过 MavenRepositorySystemUtils.newServiceLocator() 返回的 serviceLocator 检索的组件。这需要与构建 Aether session 的定位器相同。

DefaultArtifact artifact = new DefaultArtifact(coordinate);
Artifact pomArtifact = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), "pom", artifact.getVersion());

ArtifactRequest request = new ArtifactRequest(pomArtifact, Arrays.asList(aetherSession.getRemoteRepository()), null);
pomArtifact = aetherSession.getRepoSystem().resolveArtifact(session, request).getArtifact();

ModelBuilder modelBuilder = new DefaultModelBuilderFactory().newInstance();
ModelBuildingRequest buildingRequest = new DefaultModelBuildingRequest();
buildingRequest.setPomFile(pomArtifact.getFile());
buildingRequest.setProcessPlugins(true);
buildingRequest.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);

Constructor<?> constr = Class.forName("org.apache.maven.repository.internal.DefaultModelResolver").getConstructors()[0];
constr.setAccessible(true);
ModelResolver modelResolver = (ModelResolver) constr.newInstance(session, null, null,
serviceLocator.getService(ArtifactResolver.class),
serviceLocator.getService(VersionRangeResolver.class),
serviceLocator.getService(RemoteRepositoryManager.class), request.getRepositories());
buildingRequest.setModelResolver(modelResolver);

Model model = modelBuilder.build(buildingRequest).getEffectiveModel();

Xpp3Dom pluginConfiguration = (Xpp3Dom) model.getBuild().getPluginsAsMap().get("com.company.group:my-plugin").getConfiguration();
Xpp3Dom myConfig = pluginConfiguration.getChild("myConfig");
System.out.println(myConfig.getChild("somePropName").getValue()); // prints "someProp"

默认情况下,模型构建器未配置为处理插件,因此我们需要调用setProcessPlugin(true)。获得有效模型后,配置将包含在 Xpp3Dom 对象中,您可以借助 getChild(name) 导航该对象,以获取指定的子 XML 元素,并使用 getValue() 获取 XML 元素的值。

关于java - 你能使用以太从 POM 获取插件配置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com