我知道这是一个相当奇怪的请求,所以我期待一大堆问题要详细说明。
注意:我是从“主”或“测试”执行此操作,而不是在Maven插件的上下文中执行此操作。
简而言之,我想要一个众所周知的pom.xml和本地/远程存储库并解析所有项目的属性。不仅是pom中的属性及其所有父pom,还有内置属性,例如$ {project.build.target}和$ {project.version},当我使用以下代码时,这些属性不可用:
private Properties loadMavenProperties(Properties originalProperties)
{
final File pomFile = new File("pom.xml");
final MavenProject mavenProject = loadProject(pomFile);
if (mavenProject != null)
{
final Properties mavenProperties = loadMavenProperties(mavenProject);
if (mavenProperties != null)
{
originalProperties.putAll(mavenProperties);
}
}
return originalProperties;
}
private Properties loadMavenProperties(MavenProject mavenProject) throws IOException, XmlPullParserException
{
if (mavenProject.getModel().getParent() == null)
{
return mavenProject.getProperties();
}
mavenProject.setRemoteArtifactRepositories(Arrays.asList(new ArtifactRepository[0]));
final String userHome = System.getProperty("user.home");
final String localRepoPath = "/.m2/repository";
final File localRepo = new File(userHome, localRepoPath);
final Aether aether = new Aether(mavenProject, localRepo);
final Parent parent = mavenProject.getModel().getParent();
try
{
final Artifact parentArtifact = aether.resolve(new DefaultArtifact(parent.toString()), "runtime").get(0);
final Properties parentProperties = loadMavenProperties(loadProject(parentArtifact.getFile()));
if (parentProperties != null)
{
parentProperties.putAll(mavenProject.getProperties());
}
return parentProperties;
}
catch (DependencyResolutionException e)
{
throw new DowngradedException(e);
}
}
private MavenProject loadProject(File pomFile) throws IOException, XmlPullParserException
{
if (pomFile != null && pomFile.exists())
{
FileReader reader = null;
try
{
final MavenXpp3Reader mavenReader = new MavenXpp3Reader();
reader = new FileReader(pomFile);
Model model = mavenReader.read(reader);
model.setPomFile(pomFile);
return new MavenProject(model);
}
finally
{
reader.close();
}
}
return null;
}
适用于所有显式定义的属性但不包含任何内置属性。
这是一个失败的原因吗?
感谢您的任何见解。
答案 0 :(得分:0)
版本和构建目录之类的东西不会作为属性公开,而是来自MavenProject
类本身。请参阅JavaDocs。
在您的具体示例中,您将通过调用getVersion()
来获取版本,并通过调用getBuild()
来构建目录信息,该Build
将返回包含其中各种目录的{{1}}对象。