Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access Maven Artifact POM using Maven's Java API?

Tags:

java

maven

I am attempting to retrieve the entire dependency tree and their poms starting at the root of the project. I am starting with a POM already existing in my file system, but I'm not sure how to retrieve the dependency poms from the repository.

I am using the following code to access the dependency list. From the list I have all the information on the artifacts. I'm just not sure how to access the repository.

FileReader reader = null;
Model model = null;
MavenXpp3Reader mavenreader = new MavenXpp3Reader();

File pomfile = new File("pom.xml");

model.setPomFile(pomfile);
MavenProject project = new MavenProject(model);

List<Dependency> deps = project.getDependencies();

// Get dependency details
for (Dependency d: deps) {          
    System.out.print(d.getArtifactId());
    System.out.print(":");
    System.out.println(d.getVersion()); 
}           
like image 332
davdic Avatar asked Jul 25 '12 20:07

davdic


2 Answers

Actually you were pretty close to reading the dependencies. All that was missing was:

Model model = mavenreader.read(new FileReader(pomFile));

Full example:

MavenXpp3Reader mavenreader = new MavenXpp3Reader();

File pomfile = new File("pom.xml");
Model model = mavenreader.read(new FileReader(pomFile));

List<Dependency> deps = model.getDependencies();

for (Dependency d: deps) {          
    System.out.print(d.getArtifactId());
} 

This doesn't get you a dependency tree but you can repeat it for the dependencies you find.

like image 103
Andrejs Avatar answered Oct 24 '22 11:10

Andrejs


Unfotunately that is not that trivial :-) I can give you some advices though (taking into account that you need artifacts only from the central repo).

Here's a great example code I found at Github. An alternative could be using the REST API of the central repo. Here's an example how to do that programmatically.

BTW if you need the dependencies only, you could also use the maven-dependency-plugin directly (this is called on e.g. mvn dependency:tree - see this thread for an example).

Probably your method can also work, but I guess it needs some missing parts.

like image 32
rlegendi Avatar answered Oct 24 '22 11:10

rlegendi