Extracting Dependancy Lists from Maven POM Files
Recently a client of mine wanted to know if they were including the same dependency versions in their subprojects. They had 12 modules feeding into one maven-based build so I was inefficient to check the dependencies by hand. After running this program, copy the output into a program to sort it.
package com.affy.pom;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class PomAnalysisDriver {
private static XPathFactory xpathFactory = XPathFactory.newInstance();
XPathExpression artifactIdExpr = null;
XPathExpression dependencyExpr = null;
XPathExpression depGroupIdExpr = null;
XPathExpression depArtifactIdExpr = null;
XPathExpression depVersionExpr = null;
public static void main(String[] args) throws Exception {
try {
List pomFiles = new ArrayList();
PomAnalysisDriver pad = new PomAnalysisDriver();
pad.init();
pad.searchForPomFiles("[ROOT_DIR]", pomFiles);
pad.execute(pomFiles);
} finally {
System.out.println("Done.");
}
}
public void init() throws XPathExpressionException {
XPath xpath = xpathFactory.newXPath();
artifactIdExpr = xpath.compile("/project/artifactId/text()");
dependencyExpr = xpath.compile("/project/dependencies/dependency");
depGroupIdExpr = xpath.compile("./groupId/text()");
depArtifactIdExpr = xpath.compile("./artifactId/text()");
depVersionExpr = xpath.compile("./version/text()");
}
public void searchForPomFiles(final String dir, final List pomFiles) {
File initialDir = new File(dir);
if (initialDir.isDirectory() == false) {
return;
} else {
String[] files = initialDir.list();
for (String filename : files) {
String suffix = "";
if (dir.endsWith("\\") == false && dir.endsWith("/") == false) {
suffix = "\\";
}
File childDir = new File(dir + suffix + filename);
if (childDir.isDirectory() == true) {
searchForPomFiles(dir + suffix + filename, pomFiles);
} else {
if (filename.equals("pom.xml")) {
pomFiles.add(childDir.getAbsolutePath());
}
}
}
}
}
public void execute(final List pomFiles) throws SAXException, IOException,
ParserConfigurationException, XPathExpressionException {
for (String pomFilename : pomFiles) {
File f = new File(pomFilename);
Document document;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(f);
// Node projectNode = document.getDocumentElement();
// NodeList children = projectNode.getChildNodes();
String projectName = (String)artifactIdExpr.evaluate(document, XPathConstants.STRING);
List dependencies = new ArrayList();
NodeList nodes = (NodeList)dependencyExpr.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
Node dependency = nodes.item(i);
String depGroupId = (String) depGroupIdExpr.evaluate(dependency,
XPathConstants.STRING);
String depArtifactId = (String) depArtifactIdExpr.evaluate(dependency,
XPathConstants.STRING);
String depVersion = (String) depVersionExpr.evaluate(dependency,
XPathConstants.STRING);
String depId = "/" + depGroupId + "/" + depArtifactId + "/" +
depVersion + "/" + projectName;
dependencies.add(depId);
}
for (String s : dependencies) {
System.out.println(s);
}
}
}
}