diff options
author | George Fraser <george@fivetran.com> | 2019-01-01 22:33:28 -0800 |
---|---|---|
committer | George Fraser <george@fivetran.com> | 2019-01-01 22:33:28 -0800 |
commit | 818574c351f3b7ae50e36ee5fa7dadeff7393429 (patch) | |
tree | 7f346c38c42d7e7a8a3d7041b44efe8d5d6e0839 /src/main | |
parent | 4ddc36150787f5b9d8f245f5d7466b9ee47519a7 (diff) | |
download | java-language-server-818574c351f3b7ae50e36ee5fa7dadeff7393429.zip |
Get jar paths directly from maven
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/org/javacs/InferConfig.java | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/src/main/java/org/javacs/InferConfig.java b/src/main/java/org/javacs/InferConfig.java index 8568ffb..7a99328 100644 --- a/src/main/java/org/javacs/InferConfig.java +++ b/src/main/java/org/javacs/InferConfig.java @@ -3,6 +3,7 @@ package org.javacs; import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.nio.file.FileSystems; import java.nio.file.Files; @@ -77,14 +78,9 @@ class InferConfig { } // Maven - if (Files.exists(workspaceRoot.resolve("pom.xml"))) { - var result = new HashSet<Path>(); - for (var a : mvnDependencies()) { - var found = findMavenJar(a, false); - if (found.isPresent()) result.add(found.get()); - else LOG.warning(String.format("Couldn't find jar for %s in %s", a, mavenHome)); - } - return result; + var pomXml = workspaceRoot.resolve("pom.xml"); + if (Files.exists(pomXml)) { + return mvnDependencies(pomXml, "dependency:list"); } // Bazel @@ -220,12 +216,9 @@ class InferConfig { } // Maven - if (Files.exists(workspaceRoot.resolve("pom.xml"))) { - var result = new HashSet<Path>(); - for (var a : mvnDependencies()) { - findMavenJar(a, true).ifPresent(result::add); - } - return result; + var pomXml = workspaceRoot.resolve("pom.xml"); + if (Files.exists(pomXml)) { + return mvnDependencies(pomXml, "dependency:sources"); } // TODO Bazel @@ -281,63 +274,75 @@ class InferConfig { return artifact.artifactId + '-' + artifact.version + (source ? "-sources" : "") + ".jar"; } - static List<Artifact> dependencyList(Path pomXml) { + static Set<Path> mvnDependencies(Path pomXml, String goal) { Objects.requireNonNull(pomXml, "pom.xml path is null"); try { - // Tell maven to output deps to a temporary file - var outputFile = Files.createTempFile("deps", ".txt"); - - // TODO consider using mvn dependency:copy-dependencies instead + // TODO consider using mvn valide dependency:copy-dependencies -DoutputDirectory=??? instead + // Run maven as a subprocess var command = List.of( getMvnCommand(), "validate", - "dependency:list", + goal, "-DincludeScope=test", - "-DoutputFile=" + outputFile); + "-DoutputAbsoluteArtifactFilename=true"); LOG.info("Running " + String.join(" ", command) + " ..."); var workingDirectory = pomXml.toAbsolutePath().getParent().toFile(); - var log = Files.createTempFile("maven", ".log"); - LOG.info("...sending output to " + log); - var result = + var process = new ProcessBuilder() .command(command) .directory(workingDirectory) .redirectError(ProcessBuilder.Redirect.INHERIT) - .redirectOutput(ProcessBuilder.Redirect.to(log.toFile())) - .start() - .waitFor(); - + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .start(); + + // Read output on a separate thread + var reader = + new Runnable() { + Set<Path> dependencies; + + @Override + public void run() { + dependencies = readDependencyList(process.getInputStream()); + } + }; + var thread = new Thread(reader, "ReadMavenOutput"); + thread.start(); + + // Wait for process to exit + var result = process.waitFor(); if (result != 0) throw new RuntimeException("`" + String.join(" ", command) + "` returned " + result); - return readDependencyList(outputFile); + // Wait for thread to finish + thread.join(); + return reader.dependencies; } catch (InterruptedException | IOException e) { throw new RuntimeException(e); } } - private static List<Artifact> readDependencyList(Path outputFile) { - var artifact = Pattern.compile(".*:.*:.*:.*:.*"); - - try (var in = Files.newInputStream(outputFile)) { - return new BufferedReader(new InputStreamReader(in)) - .lines() - .map(String::trim) - .filter(line -> artifact.matcher(line).matches()) - .map(Artifact::parse) - .collect(Collectors.toList()); + private static Set<Path> readDependencyList(InputStream stdout) { + try (var in = new BufferedReader(new InputStreamReader(stdout))) { + var paths = new HashSet<Path>(); + for (var line = in.readLine(); line != null; line = in.readLine()) { + readDependency(line).ifPresent(paths::add); + } + return paths; } catch (IOException e) { throw new RuntimeException(e); } } - private Collection<Artifact> mvnDependencies() { - var pomXml = workspaceRoot.resolve("pom.xml"); - - if (Files.exists(pomXml)) return dependencyList(pomXml); + private static Pattern DEPENDENCY = Pattern.compile("^\\[INFO\\]\\s+(.*:.*:.*:.*:.*):(/.*)$"); - return Collections.emptyList(); + static Optional<Path> readDependency(String line) { + var match = DEPENDENCY.matcher(line); + if (!match.matches()) return Optional.empty(); + var artifact = match.group(1); + var path = match.group(2); + LOG.info(String.format("...artifact %s is at %s", artifact, path)); + return Optional.of(Paths.get(path)); } static String getMvnCommand() { |