Skip to content

Commit c7599ed

Browse files
authored
Merge pull request #71 from testmycode/mavenhack
Bundle maven and use it unless installation is found from env variables system properties
2 parents a674169 + c0c4924 commit c7599ed

File tree

7 files changed

+88
-53
lines changed

7 files changed

+88
-53
lines changed

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@
212212
<plugin>
213213
<groupId>org.apache.maven.plugins</groupId>
214214
<artifactId>maven-source-plugin</artifactId>
215+
<version>3.0.1</version>
215216
<executions>
216217
<execution>
217218
<id>attach-sources</id>
@@ -271,5 +272,5 @@
271272
</build>
272273
</profile>
273274
</profiles>
274-
275+
275276
</project>

tmc-langs-java/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@
117117
<artifactId>ant</artifactId>
118118
<version>1.9.6</version>
119119
</dependency>
120+
<dependency>
121+
122+
<groupId>org.rauschig</groupId>
123+
<artifactId>jarchivelib</artifactId>
124+
<version>0.7.1</version>
125+
</dependency>
120126

121127
<dependency>
122128
<groupId>org.apache.maven</groupId>
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package fi.helsinki.cs.tmc.langs.java.maven;
22

3-
import fi.helsinki.cs.tmc.langs.java.exception.MavenExecutorException;
43
import fi.helsinki.cs.tmc.langs.java.maven.MavenTaskRunner.MavenExecutionResult;
54

6-
import com.google.common.base.Strings;
7-
85
import org.slf4j.Logger;
96
import org.slf4j.LoggerFactory;
107

@@ -15,17 +12,7 @@ public class MavenExecutors {
1512
private static final Logger log = LoggerFactory.getLogger(MavenExecutors.class);
1613

1714
public static final MavenExecutionResult tryAndExec(Path directory, String[] mavenArgs) {
18-
if (!Strings.isNullOrEmpty(System.getenv("M3_HOME"))
19-
|| !Strings.isNullOrEmpty(System.getenv("M2_HOME"))) {
20-
log.info("Selected MavenInvokator");
21-
try {
22-
return new MavenInvokatorMavenTaskRunner().exec(directory, mavenArgs);
23-
} catch (MavenExecutorException e) {
24-
log.info("trying with MvnCli, MavenInvokatorMavenTaskRunner failed with {}", e);
25-
return new MvnCliMavenRunner().exec(directory, mavenArgs);
26-
}
27-
}
28-
log.info("Selected MvnCli");
29-
return new MvnCliMavenRunner().exec(directory, mavenArgs);
15+
log.info("Defaulting to MavenInvokator");
16+
return new MavenInvokatorMavenTaskRunner().exec(directory, mavenArgs);
3017
}
3118
}

tmc-langs-java/src/main/java/fi/helsinki/cs/tmc/langs/java/maven/MavenInvokatorMavenTaskRunner.java

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,34 @@
22

33
import fi.helsinki.cs.tmc.langs.java.exception.MavenExecutorException;
44

5+
import com.google.common.base.Preconditions;
6+
7+
import org.apache.commons.lang3.SystemUtils;
58
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
69
import org.apache.maven.shared.invoker.DefaultInvoker;
710
import org.apache.maven.shared.invoker.InvocationOutputHandler;
811
import org.apache.maven.shared.invoker.InvocationRequest;
912
import org.apache.maven.shared.invoker.InvocationResult;
1013
import org.apache.maven.shared.invoker.MavenInvocationException;
11-
1214
import org.codehaus.plexus.util.cli.CommandLineException;
13-
15+
import org.rauschig.jarchivelib.ArchiveFormat;
16+
import org.rauschig.jarchivelib.Archiver;
17+
import org.rauschig.jarchivelib.ArchiverFactory;
1418
import org.slf4j.Logger;
1519
import org.slf4j.LoggerFactory;
1620

1721
import java.io.ByteArrayOutputStream;
1822
import java.io.File;
23+
import java.io.IOException;
24+
import java.io.InputStream;
1925
import java.io.PrintStream;
26+
import java.nio.file.Files;
2027
import java.nio.file.Path;
28+
import java.nio.file.Paths;
29+
import java.nio.file.StandardCopyOption;
2130
import java.util.Arrays;
2231

32+
2333
public class MavenInvokatorMavenTaskRunner implements MavenTaskRunner {
2434

2535
private static final Logger log = LoggerFactory.getLogger(MavenInvokatorMavenTaskRunner.class);
@@ -33,14 +43,23 @@ public MavenExecutionResult exec(Path projectPath, String[] mavenArgs) {
3343
InvocationRequest request = new DefaultInvocationRequest();
3444
request.setMavenOpts(MAVEN_OPTS);
3545

36-
DefaultInvoker invoker = new DefaultInvoker();
3746
String mavenHome = System.getenv("M3_HOME");
3847
if (mavenHome == null) {
3948
mavenHome = System.getenv("M2_HOME");
4049
}
4150
if (mavenHome == null) {
4251
mavenHome = System.getenv("MAVEN_HOME");
4352
}
53+
if (mavenHome == null) {
54+
mavenHome = System.getProperty("maven.home");
55+
}
56+
if (mavenHome == null) {
57+
mavenHome = useBundledMaven().toString();
58+
}
59+
60+
log.info("Using maven at: {}", mavenHome);
61+
62+
DefaultInvoker invoker = new DefaultInvoker();
4463
invoker.setMavenHome(new File(mavenHome));
4564

4665
final ByteArrayOutputStream outBuf = new ByteArrayOutputStream();
@@ -75,4 +94,57 @@ public void consumeLine(String line) {
7594
throw new MavenExecutorException(e);
7695
}
7796
}
97+
98+
private Path useBundledMaven() {
99+
Path mavenHome = getConfigDirectory();
100+
if (Files.exists(mavenHome)) {
101+
log.info("Maven already extracted");
102+
103+
// Add the name of the extracted folder to the path
104+
return mavenHome.resolve("apache-maven-3.3.9");
105+
}
106+
log.info("Maven bundle not previously extracted, extracting...");
107+
try {
108+
InputStream data = getClass().getResourceAsStream("apache-maven-3.3.9.zip");
109+
Preconditions.checkNotNull(
110+
data, "Couldn't load bundled maven from tmc-langs-java.jar.");
111+
Path tmpFile = Files.createTempFile("tmc-maven", "zip");
112+
Files.copy(data, tmpFile, StandardCopyOption.REPLACE_EXISTING);
113+
Archiver archiver = ArchiverFactory.createArchiver(ArchiveFormat.ZIP);
114+
archiver.extract(tmpFile.toFile(), mavenHome.toFile());
115+
try {
116+
Files.deleteIfExists(tmpFile);
117+
} catch (IOException e) {
118+
log.warn("Deleting tmp apache-maven.zip failed", e);
119+
}
120+
121+
// Add the name of the extracted folder to the path
122+
return mavenHome.resolve("apache-maven-3.3.9");
123+
} catch (IOException e) {
124+
throw new RuntimeException(e);
125+
}
126+
}
127+
128+
static Path getConfigDirectory() {
129+
Path configPath;
130+
131+
if (SystemUtils.IS_OS_WINDOWS) {
132+
String appdata = System.getenv("APPDATA");
133+
if (appdata == null) {
134+
configPath = Paths.get(System.getProperty("user.home"));
135+
} else {
136+
configPath = Paths.get(appdata);
137+
}
138+
} else {
139+
//Assume we're using Unix (Linux, Mac OS X or *BSD)
140+
String configEnv = System.getenv("XDG_CONFIG_HOME");
141+
142+
if (configEnv != null && configEnv.length() > 0) {
143+
configPath = Paths.get(configEnv);
144+
} else {
145+
configPath = Paths.get(System.getProperty("user.home")).resolve(".config");
146+
}
147+
}
148+
return configPath.resolve("tmc");
149+
}
78150
}

tmc-langs-java/src/main/java/fi/helsinki/cs/tmc/langs/java/maven/MavenTaskRunner.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package fi.helsinki.cs.tmc.langs.java.maven;
22

3+
import org.apache.maven.cli.MavenCli;
4+
35
import java.nio.file.Path;
46

57
public interface MavenTaskRunner {
68

79
MavenExecutionResult exec(Path directory, String[] mavenArgs);
810

9-
public final class MavenExecutionResult {
11+
final class MavenExecutionResult {
1012

1113
private int exitCode;
1214

tmc-langs-java/src/main/java/fi/helsinki/cs/tmc/langs/java/maven/MvnCliMavenRunner.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)