From d717576b041f8bbf7462efc525ab8eba85e7caac Mon Sep 17 00:00:00 2001 From: Aleksey Dobrynin Date: Wed, 28 May 2025 17:25:14 +0200 Subject: [PATCH] [java, run configurations, jigsaw] take into account light modules when building run configurations IDEA-365889 GitOrigin-RevId: 6f010da9bd6bec02a947fe1f54bdd0fff7374989 --- .../ApplicationCommandLineState.java | 4 +- .../lightModule/lib/light-launcher-1.0.jar | Bin 0 -> 1113 bytes .../lightModule/out/production/empty.txt | 0 .../lightModule/src/module-info.java | 3 + .../modulePath/lightModule/src/p/Main.java | 7 +++ .../execution/ApplicationModulePathTest.java | 54 +++++++++++++++--- 6 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/application/modulePath/lightModule/lib/light-launcher-1.0.jar create mode 100644 java/java-tests/testData/application/modulePath/lightModule/out/production/empty.txt create mode 100644 java/java-tests/testData/application/modulePath/lightModule/src/module-info.java create mode 100644 java/java-tests/testData/application/modulePath/lightModule/src/p/Main.java diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationCommandLineState.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationCommandLineState.java index 1ee334a85377..c2c0b5ce44e6 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationCommandLineState.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationCommandLineState.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.execution.application; import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil; @@ -107,7 +107,7 @@ public abstract class ApplicationCommandLineState JavaModuleGraphUtil.findNonAutomaticDescriptorByModule(module.getModule(), false)) != null) { - boolean isExcluded = CompilerConfiguration.getInstance(module.getProject()) + boolean isExcluded = !(mainModule instanceof LightJavaModule) && CompilerConfiguration.getInstance(module.getProject()) .isExcludedFromCompilation(mainModule.getContainingFile().getVirtualFile()); if(!isExcluded) { params.setModuleName(ReadAction.compute(() -> mainModule.getName())); diff --git a/java/java-tests/testData/application/modulePath/lightModule/lib/light-launcher-1.0.jar b/java/java-tests/testData/application/modulePath/lightModule/lib/light-launcher-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cf9b0f9835455e6e9e9307d1ee445e87cc03959 GIT binary patch literal 1113 zcmWIWW@h1HVBlb2nBA}^iUA350@=Q<<2}2V>yUu}!vot1uejV1)(e!)boT?e~C#gBzzqjuG zC(Bcx9&LR%`L&j6w8R<5)!wODG6lDEEPfTXRqi>g`)zxQ#mvo;TW0M#(op>4QF3Db z!yUJ8M0;L2vRHee`!Q|RZ4=Bce>>vx>Sq0ptfg1wL9WE^8D^j>b1T8#z^(uo03Zb= zsl_FDR0$%f%1JEEOU_6wLJON~yB?K>Gcqt3F)=X6V^i(})u)%7lUQ6_8tChP$U&g? zw7Yk+VQ#Sw0pvD|3Fs~*MMFZp;y z5?&bSt~vNiS^ms2uOCaelCxG>X1cb0^HpIs4Vd_#Zhu25+v`s!@+)ol?yw8a)JS%A zKk6hpo9C)%EYGjxNtKK@%jPWY?0QkS-}*{mdd3gq=+2d!#IJ2L{%`Q)+~Mkj0Yxba z>yqkK7Dd~A>R4&9@bq5A{*+1QPtK{D5Zt!x^ZMlZE_Tzm1ne!|o~69%bB2%FRnb(o zVu525we?br*6k>;^_-Hi*iGFtj!nms>!|Lj94EIK_I1qFey4AXY@Kpuk>kZ*f(h)t zPRzS+%r^fXWc(;@L3r1CjlWVeUT(3u8yan7xS^lfsV!_(PCavgHzSh>Gxn$kC2R-~ zV0h~YVj(4SkT%>29jcFENuxTlHl$>a&tgy_gaDAmXMs#`lEm#&P@;qYkcM|aCL)RA z)&)wW5CGC80!)iAT}Vk5)t~5z7G}VbMrUl=QIl|hH!B-R0~-+L0F_?{rhEnl01q-( AcmMzZ literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/application/modulePath/lightModule/out/production/empty.txt b/java/java-tests/testData/application/modulePath/lightModule/out/production/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/application/modulePath/lightModule/src/module-info.java b/java/java-tests/testData/application/modulePath/lightModule/src/module-info.java new file mode 100644 index 000000000000..36759b4ce96c --- /dev/null +++ b/java/java-tests/testData/application/modulePath/lightModule/src/module-info.java @@ -0,0 +1,3 @@ +module my.module { + requires my.test.launcher; +} \ No newline at end of file diff --git a/java/java-tests/testData/application/modulePath/lightModule/src/p/Main.java b/java/java-tests/testData/application/modulePath/lightModule/src/p/Main.java new file mode 100644 index 000000000000..6d2b78659b0d --- /dev/null +++ b/java/java-tests/testData/application/modulePath/lightModule/src/p/Main.java @@ -0,0 +1,7 @@ +package p; + +public class Main { + public static void main(String[] args) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/execution/ApplicationModulePathTest.java b/java/java-tests/testSrc/com/intellij/java/execution/ApplicationModulePathTest.java index 192b47c47a84..e9ff2213e617 100644 --- a/java/java-tests/testSrc/com/intellij/java/execution/ApplicationModulePathTest.java +++ b/java/java-tests/testSrc/com/intellij/java/execution/ApplicationModulePathTest.java @@ -20,6 +20,7 @@ import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.testFramework.IdeaTestUtil; @@ -28,6 +29,8 @@ import com.intellij.util.PathUtil; import com.intellij.util.PathsList; import java.io.File; +import java.util.ArrayList; +import java.util.List; public class ApplicationModulePathTest extends BaseConfigurationTestCase { public void testAdditionalModules() throws Exception { @@ -36,9 +39,9 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase { ExecutionEnvironment environment = ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build(); Disposer.register(getTestRootDisposable(), environment); - JavaParameters params4Tests = + JavaParameters params4Tests = new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment).createJavaParameters4Test(); - + PathsList modulePath = params4Tests.getModulePath(); assertTrue("module path: " + modulePath.getPathsString(), modulePath.getPathList().contains(getCompilerOutputPath(myModule))); @@ -59,20 +62,20 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase { public void testServices() throws ExecutionException { Module module2 = createEmptyModule(); setupModule(getTestName(true) + "/dep", module2, getTestRootDisposable()); - + Module module3 = createEmptyModule(); setupModule(getTestName(true) + "/dep1", module3, getTestRootDisposable()); ApplicationConfiguration configuration = setupConfiguration(getTestName(true), myModule); ModuleRootModificationUtil.updateModel(myModule, model -> model.addModuleOrderEntry(module2)); ModuleRootModificationUtil.updateModel(module2, model -> model.addModuleOrderEntry(module3)); - + ExecutionEnvironment environment = ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build(); Disposer.register(getTestRootDisposable(), environment); - JavaParameters params4Tests = + JavaParameters params4Tests = new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment).createJavaParameters4Test(); - + PathsList modulePath = params4Tests.getModulePath(); assertSize(3, modulePath.getPathList()); } @@ -103,10 +106,34 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase { !commandLine.contains("-p") && !commandLine.contains("--module-path")); } + public void testLightModule() throws ExecutionException { + ApplicationConfiguration configuration = setupConfiguration(getTestName(true), myModule); + configuration.MAIN_CLASS_NAME = "my.test.launcher.Launcher"; + + VirtualFile moduleInfoFile = getContentRoot(getTestName(true)) + .findFileByRelativePath("src/module-info.java"); + assertNotNull("The file 'src/module-info.java' should exist", moduleInfoFile); + + CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(myProject); + ExcludeEntryDescription excludeEntry = new ExcludeEntryDescription(moduleInfoFile, true, false, myProject); + WriteAction.runAndWait(() -> compilerConfiguration.getExcludedEntriesConfiguration().addExcludeEntryDescription(excludeEntry)); + + ExecutionEnvironment environment = + ExecutionEnvironmentBuilder.create(myProject, DefaultRunExecutor.getRunExecutorInstance(), configuration).build(); + Disposer.register(getTestRootDisposable(), environment); + JavaParameters params4Tests = new ApplicationConfiguration.JavaApplicationCommandLineState<>(configuration, environment) + .createJavaParameters4Test(); + + String commandLine = params4Tests.toCommandLine().getCommandLineString(); + + assertEquals("my.test.launcher", params4Tests.getModuleName()); + assertTrue("The command line should contain the launcher from a light module", commandLine.contains("-m my.test.launcher/my.test.launcher.Launcher")); + } + private ApplicationConfiguration setupConfiguration(String sources, Module module) { setupModule(sources, module, getTestRootDisposable()); - + PsiClass aClass = findClass(module, "p.Main"); assertNotNull(aClass); @@ -119,12 +146,23 @@ public class ApplicationModulePathTest extends BaseConfigurationTestCase { ContentEntry contentEntry = model.addContentEntry(contentRoot); contentEntry.addSourceFolder(contentRoot.getUrl() + "/src", false); + VirtualFile libDir = contentRoot.findChild("lib"); + if (libDir != null) { + List lib = new ArrayList<>(); + for (VirtualFile jar : libDir.getChildren()) { + if (jar.isDirectory() || !jar.getName().endsWith(".jar")) continue; + lib.add(VfsUtil.getUrlForLibraryRoot(jar.toNioPath())); + } + + ModuleRootModificationUtil.addModuleLibrary(module, "lib", lib, List.of()); + } + CompilerModuleExtension moduleExtension = model.getModuleExtension(CompilerModuleExtension.class); moduleExtension.inheritCompilerOutputPath(false); moduleExtension.setCompilerOutputPath(contentRoot.findFileByRelativePath("out/production")); }); Sdk jdk9 = IdeaTestUtil.getMockJdk9(); - WriteAction.runAndWait(()-> ProjectJdkTable.getInstance().addJdk(jdk9, parentDisposable)); + WriteAction.runAndWait(() -> ProjectJdkTable.getInstance().addJdk(jdk9, parentDisposable)); ModuleRootModificationUtil.setModuleSdk(module, jdk9); IndexingTestUtil.waitUntilIndexesAreReady(module.getProject()); }