diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildCommandLineBuilder.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildCommandLineBuilder.java index d93afc8e4db9..0bef857aa5dd 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildCommandLineBuilder.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildCommandLineBuilder.java @@ -6,6 +6,7 @@ import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import org.jetbrains.annotations.NotNull; +import java.io.File; import java.net.InetAddress; import java.nio.charset.Charset; import java.nio.file.Path; @@ -40,4 +41,7 @@ interface BuildCommandLineBuilder { default void setupAdditionalVMOptions() { } + + default void copyPathToTarget(File file) { + } } diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index ddee5859d60a..7084822cd8db 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -1400,7 +1400,7 @@ public final class BuildManager implements Disposable { final File projectSystemRoot = getProjectSystemDirectory(project); if (projectSystemRoot != null) { - cmdLine.addParameter("-Djava.io.tmpdir=" + FileUtil.toSystemIndependentName(projectSystemRoot.getPath()) + "/" + TEMP_DIR_NAME); + cmdLine.addPathParameter("-Djava.io.tmpdir=", FileUtil.toSystemIndependentName(projectSystemRoot.getPath()) + "/" + TEMP_DIR_NAME); } for (BuildProcessParametersProvider provider : BuildProcessParametersProvider.EP_NAME.getExtensions(project)) { @@ -1449,6 +1449,13 @@ public final class BuildManager implements Disposable { final List cp = myClasspathManager.getBuildProcessClasspath(project); cmdLine.addClasspathParameter(cp, isProfilingMode ? Collections.singletonList("yjp-controller-api-redist.jar") : Collections.emptyList()); + for (BuildProcessParametersProvider buildProcessParametersProvider : BuildProcessParametersProvider.EP_NAME.getExtensions(project)) { + List pluginPaths = buildProcessParametersProvider.getAdditionalPluginPaths(); + for (String path : pluginPaths) { + cmdLine.copyPathToTarget(new File(path)); + } + } + cmdLine.addParameter(BuildMain.class.getName()); cmdLine.addParameter(cmdLine.getHostIp()); cmdLine.addParameter(Integer.toString(listenPort)); diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildProcessParametersProvider.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildProcessParametersProvider.java index 3a98bca166ab..a3dd3f8fe043 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildProcessParametersProvider.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildProcessParametersProvider.java @@ -32,6 +32,14 @@ public abstract class BuildProcessParametersProvider { return Collections.emptyList(); } + /** + * Override this method to specify list of files that are required for the build to work but shouldn't be added to the + * build process classpath. + */ + public @NotNull List getAdditionalPluginPaths() { + return Collections.emptyList(); + } + public @NotNull List getVMArguments() { return Collections.emptyList(); } diff --git a/java/compiler/impl/src/com/intellij/compiler/server/WslBuildCommandLineBuilder.java b/java/compiler/impl/src/com/intellij/compiler/server/WslBuildCommandLineBuilder.java index 3e228daee4d6..4ca5609c78c2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/WslBuildCommandLineBuilder.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/WslBuildCommandLineBuilder.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.api.GlobalOptions; +import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.nio.charset.Charset; @@ -124,6 +125,21 @@ final class WslBuildCommandLineBuilder implements BuildCommandLineBuilder { myCommandLine.addParameter(builder.toString()); } + @Override + public void copyPathToTarget(File file) { + if (myClasspathDirectory != null && myHostClasspathDirectory != null) { + Path targetPath = myHostClasspathDirectory.resolve(file.getName()); + if (!targetPath.toFile().exists()) { + try { + FileUtil.copyFileOrDir(file, targetPath.toFile()); + } + catch (IOException e) { + // ignore + } + } + } + } + @Override public @NotNull Path getHostWorkingDirectory() { return Paths.get(myHostWorkingDirectory); diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index e89b14ae2320..20e8df2dc0f5 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -4,10 +4,10 @@ package org.jetbrains.jps.incremental.groovy; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.groovy.compiler.rt.GroovyRtJarPaths; import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.java.JavaBuilderUtil; @@ -125,42 +125,7 @@ public class GroovyBuilder extends ModuleLevelBuilder { } static List getGroovyRtRoots() { - return getGroovyRtRoots(ClasspathBootstrap.getResourceFile(GroovyBuilder.class)); - } - - static List getGroovyRtRoots(File jpsPluginRoot) { - List result = new ArrayList<>(); - addGroovyRtJarPath(jpsPluginRoot, "groovy-rt.jar", - Collections.singletonList("intellij.groovy.rt"), "groovy-rt", result); - addGroovyRtJarPath(jpsPluginRoot, "groovy-constants-rt.jar", - Collections.singletonList("intellij.groovy.constants.rt"), "groovy-constants-rt", result); - return result; - } - - private static void addGroovyRtJarPath(File jpsPluginClassesRoot, String jarNameInDistribution, - List moduleNames, - String mavenArtifactNamePrefix, - @NotNull List to) { - File parentDir = jpsPluginClassesRoot.getParentFile(); - if (jpsPluginClassesRoot.isFile()) { - String fileName; - if (jpsPluginClassesRoot.getName().equals("groovy-jps.jar")) { - fileName = jarNameInDistribution; - } - else { - String version = StringUtil.substringAfterLast(FileUtil.getNameWithoutExtension(jpsPluginClassesRoot), "-"); - fileName = mavenArtifactNamePrefix + "-" + version + ".jar"; - if (parentDir.getName().equals(version)) { - parentDir = new File(parentDir.getParentFile().getParentFile(), mavenArtifactNamePrefix + "/" + version); - } - } - to.add(new File(parentDir, fileName).getPath()); - } - else { - for (String moduleName : moduleNames) { - to.add(new File(parentDir, moduleName).getPath()); - } - } + return GroovyRtJarPaths.getGroovyRtRoots(ClasspathBootstrap.getResourceFile(GroovyBuilder.class)); } public static boolean isGroovyFile(String path) { diff --git a/plugins/groovy/jps-plugin/testSrc/org/jetbrains/jps/incremental/groovy/GroovyRtPathsTest.kt b/plugins/groovy/jps-plugin/testSrc/org/jetbrains/jps/incremental/groovy/GroovyRtPathsTest.kt index cb8c2e7b69a3..de37f798afd5 100644 --- a/plugins/groovy/jps-plugin/testSrc/org/jetbrains/jps/incremental/groovy/GroovyRtPathsTest.kt +++ b/plugins/groovy/jps-plugin/testSrc/org/jetbrains/jps/incremental/groovy/GroovyRtPathsTest.kt @@ -3,6 +3,7 @@ package org.jetbrains.jps.incremental.groovy import com.intellij.openapi.util.io.FileUtil import com.intellij.util.io.directoryContent +import org.jetbrains.groovy.compiler.rt.GroovyRtJarPaths import org.junit.Assert import org.junit.Test import java.io.File @@ -15,7 +16,7 @@ class GroovyRtPathsTest { dir("intellij.groovy.jps") {} dir("intellij.groovy.rt") {} }.generateInTempDir().toFile() - val roots = GroovyBuilder.getGroovyRtRoots(File(out, "intellij.groovy.jps")) + val roots = GroovyRtJarPaths.getGroovyRtRoots(File(out, "intellij.groovy.jps")) assertSameFiles(roots, File(out, "intellij.groovy.rt"), File(out, "intellij.groovy.constants.rt")) } @@ -26,7 +27,7 @@ class GroovyRtPathsTest { file("groovy-constants-rt.jar") file("groovy-rt.jar") }.generateInTempDir().toFile() - val roots = GroovyBuilder.getGroovyRtRoots(File(lib, "groovy-jps.jar")) + val roots = GroovyRtJarPaths.getGroovyRtRoots(File(lib, "groovy-jps.jar")) assertSameFiles(roots, File(lib, "groovy-rt.jar"), File(lib, "groovy-constants-rt.jar")) } @@ -37,7 +38,7 @@ class GroovyRtPathsTest { file("groovy-rt-193.239.jar") file("groovy-jps-193.239.jar") }.generateInTempDir().toFile() - val roots = GroovyBuilder.getGroovyRtRoots(File(lib, "groovy-jps-193.239.jar")) + val roots = GroovyRtJarPaths.getGroovyRtRoots(File(lib, "groovy-jps-193.239.jar")) assertSameFiles(roots, File(lib, "groovy-rt-193.239.jar"), File(lib, "groovy-constants-rt-193.239.jar")) } @@ -62,7 +63,8 @@ class GroovyRtPathsTest { } } }.generateInTempDir().toFile() - val roots = GroovyBuilder.getGroovyRtRoots(File(repo, "com/jetbrains/intellij/groovy/groovy-jps/193.239/groovy-jps-193.239.jar")) + val roots = GroovyRtJarPaths.getGroovyRtRoots( + File(repo, "com/jetbrains/intellij/groovy/groovy-jps/193.239/groovy-jps-193.239.jar")) assertSameFiles(roots, File(repo, "com/jetbrains/intellij/groovy/groovy-rt/193.239/groovy-rt-193.239.jar"), File(repo, "com/jetbrains/intellij/groovy/groovy-constants-rt/193.239/groovy-constants-rt-193.239.jar")) } diff --git a/plugins/groovy/rt-constants/src/org/jetbrains/groovy/compiler/rt/GroovyRtJarPaths.java b/plugins/groovy/rt-constants/src/org/jetbrains/groovy/compiler/rt/GroovyRtJarPaths.java new file mode 100644 index 000000000000..7b3638b5cde8 --- /dev/null +++ b/plugins/groovy/rt-constants/src/org/jetbrains/groovy/compiler/rt/GroovyRtJarPaths.java @@ -0,0 +1,49 @@ +// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.groovy.compiler.rt; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class GroovyRtJarPaths { + public static List getGroovyRtRoots(File jpsPluginRoot) { + List result = new ArrayList(); + addGroovyRtJarPath(jpsPluginRoot, "groovy-rt.jar", + Collections.singletonList("intellij.groovy.rt"), "groovy-rt", result); + addGroovyRtJarPath(jpsPluginRoot, "groovy-constants-rt.jar", + Collections.singletonList("intellij.groovy.constants.rt"), "groovy-constants-rt", result); + return result; + } + + private static void addGroovyRtJarPath(File jpsPluginClassesRoot, + String jarNameInDistribution, + List moduleNames, + String mavenArtifactNamePrefix, + List to) { + File parentDir = jpsPluginClassesRoot.getParentFile(); + if (jpsPluginClassesRoot.isFile()) { + String fileName; + if (jpsPluginClassesRoot.getName().equals("groovy-jps.jar")) { + fileName = jarNameInDistribution; + } + else { + String name = jpsPluginClassesRoot.getName(); + int dotIndex = name.lastIndexOf('.'); + name = dotIndex < 0 ? name : name.substring(0, dotIndex); + int dashIndex = name.lastIndexOf('-'); + String version = dashIndex < 0 ? null : name.substring(dashIndex + 1); + fileName = mavenArtifactNamePrefix + "-" + version + ".jar"; + if (parentDir.getName().equals(version)) { + parentDir = new File(parentDir.getParentFile().getParentFile(), mavenArtifactNamePrefix + "/" + version); + } + } + to.add(new File(parentDir, fileName).getPath()); + } + else { + for (String moduleName : moduleNames) { + to.add(new File(parentDir, moduleName).getPath()); + } + } + } +} diff --git a/plugins/groovy/rt/intellij.groovy.rt.iml b/plugins/groovy/rt/intellij.groovy.rt.iml index 5fb1939b29be..311dceb13717 100644 --- a/plugins/groovy/rt/intellij.groovy.rt.iml +++ b/plugins/groovy/rt/intellij.groovy.rt.iml @@ -10,7 +10,7 @@ - + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GrBuildProcessParametersProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GrBuildProcessParametersProvider.java index c15008e2a83b..05258d16f9f7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GrBuildProcessParametersProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GrBuildProcessParametersProvider.java @@ -5,12 +5,16 @@ import com.intellij.compiler.CompilerConfiguration; import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.compiler.impl.javaCompiler.BackendCompiler; import com.intellij.compiler.server.BuildProcessParametersProvider; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; +import org.jetbrains.groovy.compiler.rt.GroovyRtJarPaths; import org.jetbrains.jps.builders.impl.java.EclipseCompilerTool; import org.jetbrains.jps.incremental.groovy.GreclipseBuilder; +import org.jetbrains.jps.incremental.groovy.GroovyBuilder; import java.io.File; +import java.nio.file.Path; import java.util.Collections; import java.util.List; @@ -37,4 +41,13 @@ final class GrBuildProcessParametersProvider extends BuildProcessParametersProvi return Collections.emptyList(); } + + @Override + public @NotNull List getAdditionalPluginPaths() { + Path jarPath = PathManager.getJarForClass(GroovyBuilder.class); + if (jarPath == null) { + return Collections.emptyList(); + } + return GroovyRtJarPaths.getGroovyRtRoots(jarPath.toFile()); + } } \ No newline at end of file