1414import java .nio .file .Files ;
1515import java .nio .file .Path ;
1616import java .nio .file .Paths ;
17+ import java .util .ArrayList ;
18+ import java .util .Arrays ;
19+ import java .util .LinkedHashMap ;
1720import java .util .List ;
21+ import java .util .Map ;
1822import java .util .concurrent .CompletableFuture ;
1923import java .util .concurrent .CompletionException ;
2024
2125import org .eclipse .lsp4j .Command ;
2226import org .springframework .ide .vscode .commons .java .IJavaProject ;
2327import org .springframework .ide .vscode .commons .languageserver .util .OS ;
2428import org .springframework .ide .vscode .commons .languageserver .util .SimpleLanguageServer ;
25-
29+ import com . google . gson . JsonObject ;
2630import com .google .gson .JsonPrimitive ;
2731
2832public class DefaultBuildCommandProvider implements BuildCommandProvider {
@@ -38,9 +42,10 @@ public DefaultBuildCommandProvider(SimpleLanguageServer server) {
3842 server .onCommand (CMD_EXEC_MAVEN_GOAL , params -> {
3943 String pomPath = extractString (params .getArguments ().get (0 ));
4044 String goal = extractString (params .getArguments ().get (1 ));
45+ Map <String , String > env = params .getArguments ().size () > 2 ? extractEnv (params .getArguments ().get (2 )) : null ;
4146 return CompletableFuture .runAsync (() -> {
4247 try {
43- executeMaven (Paths .get (pomPath ), goal .trim ().split ("\\ s+" )).get ();
48+ executeMaven (Paths .get (pomPath ), goal .trim ().split ("\\ s+" ), env ).get ();
4449 } catch (Exception e ) {
4550 throw new CompletionException (e );
4651 }
@@ -51,9 +56,10 @@ public DefaultBuildCommandProvider(SimpleLanguageServer server) {
5156 server .onCommand (CMD_EXEC_GRADLE_BUILD , params -> {
5257 String gradleBuildPath = extractString (params .getArguments ().get (0 ));
5358 String command = extractString (params .getArguments ().get (1 ));
59+ Map <String , String > env = params .getArguments ().size () > 2 ? extractEnv (params .getArguments ().get (2 )) : null ;
5460 return CompletableFuture .runAsync (() -> {
5561 try {
56- executeGradle (Paths .get (gradleBuildPath ), command .trim ().split ("\\ s+" )).get ();
62+ executeGradle (Paths .get (gradleBuildPath ), command .trim ().split ("\\ s+" ), env ).get ();
5763 } catch (Exception e ) {
5864 throw new CompletionException (e );
5965 }
@@ -66,7 +72,13 @@ public Command executeMavenGoal(IJavaProject project, String goal) {
6672 Command cmd = new Command ();
6773 cmd .setCommand (CMD_EXEC_MAVEN_GOAL );
6874 cmd .setTitle ("Execute Maven Goal" );
69- cmd .setArguments (List .of (Paths .get (project .getProjectBuild ().getBuildFile ()).toFile ().toString (), goal ));
75+ List <Object > args = new ArrayList <>(List .of (
76+ Paths .get (project .getProjectBuild ().getBuildFile ()).toFile ().toString (), goal ));
77+ Map <String , String > env = BuildCommandProvider .buildEnv (project );
78+ if (!env .isEmpty ()) {
79+ args .add (env );
80+ }
81+ cmd .setArguments (args );
7082 return cmd ;
7183 }
7284
@@ -75,25 +87,44 @@ public Command executeGradleBuild(IJavaProject project, String command) {
7587 Command cmd = new Command ();
7688 cmd .setCommand (CMD_EXEC_GRADLE_BUILD );
7789 cmd .setTitle ("Execute Gradle Build" );
78- cmd .setArguments (List .of (Paths .get (project .getProjectBuild ().getBuildFile ()).toFile ().toString (), command ));
90+ List <Object > args = new ArrayList <>(List .of (
91+ Paths .get (project .getProjectBuild ().getBuildFile ()).toFile ().toString (), command ));
92+ Map <String , String > env = BuildCommandProvider .buildEnv (project );
93+ if (env != null && !env .isEmpty ()) {
94+ args .add (env );
95+ }
96+ cmd .setArguments (args );
7997 return cmd ;
8098 }
8199
82100 private static String extractString (Object o ) {
83101 return o instanceof JsonPrimitive ? ((JsonPrimitive ) o ).getAsString () : o .toString ();
84102 }
85103
86- private CompletableFuture <Void > executeMaven (Path pom , String [] goal ) {
104+ private static Map <String , String > extractEnv (Object o ) {
105+ Map <String , String > env = new LinkedHashMap <>();
106+ if (o instanceof JsonObject jo ) {
107+ jo .entrySet ().forEach (e -> env .put (e .getKey (), e .getValue ().getAsString ()));
108+ }
109+ return env ;
110+ }
111+
112+ private CompletableFuture <Void > executeMaven (Path pom , String [] goal , Map <String , String > env ) {
87113 synchronized (MAVEN_LOCK ) {
88- String [] cmd = new String [1 + goal .length ];
89114 Path projectPath = pom .getParent ();
90115 Path mvnw = projectPath .resolve (OS .isWindows () ? "mvnw.cmd" : "mvnw" );
91- cmd [0 ] = Files .isRegularFile (mvnw ) ? mvnw .toFile ().toString () : "mvn" ;
92- System .arraycopy (goal , 0 , cmd , 1 , goal .length );
116+ List <String > cmdList = new ArrayList <>();
117+ cmdList .add (Files .isRegularFile (mvnw ) ? mvnw .toFile ().toString () : "mvn" );
118+ cmdList .addAll (Arrays .asList (goal ));
93119 try {
94- return Runtime .getRuntime ().exec (cmd , null , projectPath .toFile ()).onExit ().thenAccept (process -> {
120+ ProcessBuilder pb = new ProcessBuilder (cmdList );
121+ pb .directory (projectPath .toFile ());
122+ if (env != null && !env .isEmpty ()) {
123+ pb .environment ().putAll (env );
124+ }
125+ return pb .start ().onExit ().thenAccept (process -> {
95126 if (process .exitValue () != 0 ) {
96- throw new CompletionException ("Failed to execute Maven goal" , new IllegalStateException ("Errors running maven command: %s" .formatted (String .join (" " , cmd ))));
127+ throw new CompletionException ("Failed to execute Maven goal" , new IllegalStateException ("Errors running maven command: %s" .formatted (String .join (" " , cmdList ))));
97128 }
98129 });
99130 } catch (IOException e ) {
@@ -102,16 +133,21 @@ private CompletableFuture<Void> executeMaven(Path pom, String[] goal) {
102133 }
103134 }
104135
105- private CompletableFuture <Void > executeGradle (Path gradleBuildPath , String [] command ) {
106- String [] cmd = new String [1 + command .length ];
136+ private CompletableFuture <Void > executeGradle (Path gradleBuildPath , String [] command , Map <String , String > env ) {
107137 Path projectPath = gradleBuildPath .getParent ();
108- Path mvnw = projectPath .resolve (OS .isWindows () ? "gradlew.cmd" : "gradlew" );
109- cmd [0 ] = Files .isRegularFile (mvnw ) ? mvnw .toFile ().toString () : "gradle" ;
110- System .arraycopy (command , 0 , cmd , 1 , command .length );
138+ Path gradlew = projectPath .resolve (OS .isWindows () ? "gradlew.cmd" : "gradlew" );
139+ List <String > cmdList = new ArrayList <>();
140+ cmdList .add (Files .isRegularFile (gradlew ) ? gradlew .toFile ().toString () : "gradle" );
141+ cmdList .addAll (Arrays .asList (command ));
111142 try {
112- return Runtime .getRuntime ().exec (cmd , null , projectPath .toFile ()).onExit ().thenAccept (process -> {
143+ ProcessBuilder pb = new ProcessBuilder (cmdList );
144+ pb .directory (projectPath .toFile ());
145+ if (env != null && !env .isEmpty ()) {
146+ pb .environment ().putAll (env );
147+ }
148+ return pb .start ().onExit ().thenAccept (process -> {
113149 if (process .exitValue () != 0 ) {
114- throw new CompletionException ("Failed to execute Gradle build" , new IllegalStateException ("Errors running gradle command: %s" .formatted (String .join (" " , cmd ))));
150+ throw new CompletionException ("Failed to execute Gradle build" , new IllegalStateException ("Errors running gradle command: %s" .formatted (String .join (" " , cmdList ))));
115151 }
116152 });
117153 } catch (IOException e ) {
0 commit comments