我希望maven为我解析一个pom文件,然后打印出生成的工件的坐标。 Maven显然正在解析这个信息,我只是想知道如何打印它然后让maven停止。我想在一些shell脚本中使用它,并且在bash中解析pom似乎很麻烦 - 特别是在所有继承含义和依赖性坐标中列出。我不希望任何建筑物发生,因为我可能只有POM,而不是源文件。
到目前为止,我发现的最佳方法是解析输出:
mvn -N dependency:tree
这似乎有点重,因为它解析所有依赖项。有更好的方法吗?
答案 0 :(得分:1)
你可以创建一个小的java程序,它完全按照以下方式执行:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
public class PomRead {
public String getPomVersion(Model model) {
String result = model.getVersion();
if (result == null) {
throw new IllegalArgumentException("The artifact does not define a version.");
}
return result;
}
public Model readModel(InputStream is) throws IOException, XmlPullParserException {
MavenXpp3Reader model = new MavenXpp3Reader();
Model read = model.read(is);
return read;
}
public Model readModel(File file) throws IOException, XmlPullParserException {
FileInputStream fis = new FileInputStream(file);
return readModel(fis);
}
public String getVersionFromPom(File pomFile) throws IOException, XmlPullParserException {
Model model = readModel(pomFile);
return getPomVersion(model);
}
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Invalid number of arguments.");
System.err.println("");
System.err.println("usage: pom.xml");
return;
}
String pom = args[0];
File pomFile = new File(pom);
if (!pomFile.exists() || !pomFile.isFile() || !pomFile.canRead()) {
System.err.println("File " + pomFile + " can not be accessed or does not exist.");
return;
}
PomRead pomRead = new PomRead();
try {
String version = pomRead.getVersionFromPom(pomFile);
System.out.println(version);
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
} catch (IOException e) {
System.err.println(e.getMessage());
} catch (XmlPullParserException e) {
System.err.println(e.getMessage());
}
}
}
对于那个单一依赖很重要的小程序,当然需要以下pom.xml:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.0.5</version>
</dependency>
可能应该将这样一个目标添加到众多maven插件之一来支持这样的事情。上面只打印出版本,但可以简单地增强打印groupId和artifactId。