From d692e299bcaeb1c9984f7d14ecaa25dafdf2ca57 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Mon, 29 Mar 2021 23:32:36 +0700 Subject: [PATCH] IDEA-265157 - moved jpms jlink part from compiler to jps.build module, some UI remarks GitOrigin-RevId: e1b88b157dcbfd1d6e546064a010b5a20206b161 --- .../messages/JavaCompilerBundle.properties | 4 - java/java-impl/src/META-INF/JavaPlugin.xml | 2 - .../jlink/JLinkArtifactProperties.java | 19 ++- .../jlink/JLinkArtifactPropertiesEditor.java | 14 +- .../resources/messages/JavaBundle.properties | 3 + .../messages/JpsBuildBundle.properties | 6 + ...ilders.artifacts.ArtifactBuildTaskProvider | 2 +- ....serialization.JpsModelSerializerExtension | 2 +- .../jlink/JLinkArtifactBuildTaskProvider.java | 151 ++++++++++++++---- .../jlink/JpsJLinkArtifactType.java | 2 +- .../JpsJLinkModelSerializerExtension.java | 2 +- .../packaging}/jlink/JpsJLinkProperties.java | 4 +- 12 files changed, 158 insertions(+), 53 deletions(-) rename {java/compiler/impl => jps/jps-builders}/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider (68%) rename {java/compiler/impl => jps/jps-builders}/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension (68%) rename {java/compiler/impl/src/com/intellij/packaging/impl => jps/jps-builders/src/org/jetbrains/jps/packaging}/jlink/JLinkArtifactBuildTaskProvider.java (54%) rename {java/compiler/impl/src/com/intellij/packaging/impl => jps/jps-builders/src/org/jetbrains/jps/packaging}/jlink/JpsJLinkArtifactType.java (92%) rename {java/compiler/impl/src/com/intellij/packaging/impl => jps/jps-builders/src/org/jetbrains/jps/packaging}/jlink/JpsJLinkModelSerializerExtension.java (97%) rename {java/compiler/impl/src/com/intellij/packaging/impl => jps/jps-builders/src/org/jetbrains/jps/packaging}/jlink/JpsJLinkProperties.java (93%) diff --git a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties index 7910eb77b79b..3f8b219655cd 100644 --- a/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties +++ b/java/compiler/openapi/resources/messages/JavaCompilerBundle.properties @@ -105,10 +105,6 @@ checkbox.text.compile.affected.unloaded.modules=Compile affected &unloaded modul dialog.title.output.directory.for.artifact=Output Directory for Artifact chooser.description.select.output.directory.for.0.artifact=Select output directory for ''{0}'' artifact -packaging.jlink.build.task.modules.not.found=JPMS modules not found -packaging.jlink.build.task.run.time.image.deletion.failure=Couldn't delete existing run-time image -packaging.jlink.build.task.failure=jlink task has failed - #package file action action.name.package.file=Package File action.description.package.file=Update the file in the corresponding artifacts diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 51464402d55e..0ab853c3234f 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -269,8 +269,6 @@ - - v.myValue == value).findFirst().orElse(null); + static CompressionLevel getLevelByText(@NotNull String text) { + return Stream.of(values()).filter(v -> v.myText.equals(text)).findFirst().orElse(null); } } } diff --git a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java index 96cdd39399f4..511c74071ed7 100644 --- a/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java +++ b/java/java-impl/src/com/intellij/packaging/jlink/JLinkArtifactPropertiesEditor.java @@ -18,7 +18,7 @@ import static com.intellij.packaging.jlink.JLinkArtifactProperties.CompressionLe final class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { private final JLinkArtifactProperties myProperties; - private ComboBox myCompressionLevel; + private ComboBox myCompressionLevel; private JCheckBox myVerbose; JLinkArtifactPropertiesEditor(@NotNull JLinkArtifactProperties properties) { @@ -35,8 +35,12 @@ final class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { public @Nullable JComponent createComponent() { final FormBuilder builder = new FormBuilder(); - myCompressionLevel = new ComboBox<>(EnumSet.allOf(CompressionLevel.class).stream().map(level -> level.myValue).toArray(Integer[]::new)); - myCompressionLevel.setItem(myProperties.compressionLevel.myValue); + myCompressionLevel = new ComboBox<>(EnumSet.allOf(CompressionLevel.class).stream().map(level -> level.myText).toArray(String[]::new)); + CompressionLevel compressionLevel = myProperties.compressionLevel; + if (compressionLevel == null) { + compressionLevel = CompressionLevel.ZERO; + } + myCompressionLevel.setItem(compressionLevel.myText); builder.addLabeledComponent(JavaBundle.message("packaging.jlink.compression.level"), myCompressionLevel); myVerbose = new JCheckBox(JavaBundle.message("packaging.jlink.verbose.tracing"), myProperties.verbose); @@ -47,7 +51,7 @@ final class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { @Override public boolean isModified() { - if (myProperties.compressionLevel != CompressionLevel.getLevelByValue(myCompressionLevel.getItem())) return true; + if (myProperties.compressionLevel != CompressionLevel.getLevelByText(myCompressionLevel.getItem())) return true; if (myProperties.verbose != myVerbose.isSelected()) return true; return false; } @@ -55,7 +59,7 @@ final class JLinkArtifactPropertiesEditor extends ArtifactPropertiesEditor { @Override public void apply() { myProperties.compressionLevel = Optional.ofNullable(myCompressionLevel.getItem()) - .map(i -> CompressionLevel.getLevelByValue(i)) + .map(i -> CompressionLevel.getLevelByText(i)) .orElse(CompressionLevel.ZERO); myProperties.verbose = myVerbose.isSelected(); } diff --git a/java/openapi/resources/messages/JavaBundle.properties b/java/openapi/resources/messages/JavaBundle.properties index 6cd26ede1b01..44a8072dca7b 100644 --- a/java/openapi/resources/messages/JavaBundle.properties +++ b/java/openapi/resources/messages/JavaBundle.properties @@ -1040,6 +1040,9 @@ package.dependencies.test.node.text=Test Classes packaging.jlink.artifact.name=JLink packaging.jlink.artifact.title=Run-time image packaging.jlink.compression.level=Compression level +packaging.jlink.compression.zero.level=No compression +packaging.jlink.compression.first.level=String sharing +packaging.jlink.compression.second.level=Zip packaging.jlink.verbose.tracing=Enable verbose tracing paste.class.command.name=Paste class ''{0}'' please.report.a.bug=Please report a bug diff --git a/jps/jps-builders/resources/messages/JpsBuildBundle.properties b/jps/jps-builders/resources/messages/JpsBuildBundle.properties index 9dc6d2bbfc3b..479cc5b2219e 100644 --- a/jps/jps-builders/resources/messages/JpsBuildBundle.properties +++ b/jps/jps-builders/resources/messages/JpsBuildBundle.properties @@ -107,3 +107,9 @@ progress.message.copying.resources.0=Copying resources... [{0}] # intellilang-jps intellilang.pattern.validator.presentable.name=IntelliLang pattern validator intellilang.pattern.validator.progress.message=Adding pattern assertions... + +packaging.jlink.build.task.modules.not.found=JPMS modules not found +packaging.jlink.build.task.wrong.java.version=Java version 9 or higher is required to build run-time image using jlink +packaging.jlink.build.task.unknown.artifact.path=Unknown artifact output path +packaging.jlink.build.task.run.time.image.deletion.failure=Couldn't delete existing run-time image +packaging.jlink.build.task.failure=jlink task has failed \ No newline at end of file diff --git a/java/compiler/impl/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider similarity index 68% rename from java/compiler/impl/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider rename to jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider index 256a113595ad..536b0033a330 100644 --- a/java/compiler/impl/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider +++ b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider @@ -1,2 +1,2 @@ # 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. -com.intellij.packaging.impl.jlink.JLinkArtifactBuildTaskProvider \ No newline at end of file +org.jetbrains.jps.packaging.jlink.JLinkArtifactBuildTaskProvider \ No newline at end of file diff --git a/java/compiler/impl/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension similarity index 68% rename from java/compiler/impl/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension rename to jps/jps-builders/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension index 45d5b2f2276d..51f1c096a89c 100644 --- a/java/compiler/impl/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension +++ b/jps/jps-builders/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension @@ -1,2 +1,2 @@ # 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. -com.intellij.packaging.impl.jlink.JpsJLinkModelSerializerExtension \ No newline at end of file +org.jetbrains.jps.packaging.jlink.JpsJLinkModelSerializerExtension \ No newline at end of file diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JLinkArtifactBuildTaskProvider.java similarity index 54% rename from java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java rename to jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JLinkArtifactBuildTaskProvider.java index 5b957504bc9b..71fbbba3ba04 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JLinkArtifactBuildTaskProvider.java +++ b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JLinkArtifactBuildTaskProvider.java @@ -1,20 +1,21 @@ // 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 com.intellij.packaging.impl.jlink; +package org.jetbrains.jps.packaging.jlink; import com.intellij.execution.CommandLineUtil; import com.intellij.execution.process.BaseOSProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessOutputTypes; -import com.intellij.openapi.compiler.JavaCompilerBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.builders.JpsBuildBundle; import org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider; import org.jetbrains.jps.incremental.BuildTask; import org.jetbrains.jps.incremental.CompileContext; @@ -23,18 +24,17 @@ import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.artifact.JpsArtifact; +import org.jetbrains.jps.model.java.JpsJavaSdkType; import org.jetbrains.jps.model.library.sdk.JpsSdk; +import org.jetbrains.jps.model.library.sdk.JpsSdkType; -import java.io.File; import java.io.IOException; -import java.lang.module.ModuleFinder; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.nio.file.Paths; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvider { @@ -61,45 +61,66 @@ public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvi public void build(@NotNull CompileContext context) throws ProjectBuildException { LOG.info("jlink task was started"); + if (!isValidJdk(context)) { + error(context, JpsBuildBundle.message("packaging.jlink.build.task.wrong.java.version")); + return; + } JpsJLinkProperties properties = (JpsJLinkProperties)myArtifact.getProperties(); - String runtimeImagePath = myArtifact.getOutputPath() + File.separator + "jdk"; - List commands = buildCommands(context, properties, runtimeImagePath); + String artifactOutputPath = myArtifact.getOutputPath(); + if (artifactOutputPath == null) { + error(context, JpsBuildBundle.message("packaging.jlink.build.task.unknown.artifact.path")); + return; + } + Path runtimeImagePath = Paths.get(artifactOutputPath, "jdk"); + List commands = buildCommands(context, properties, artifactOutputPath, runtimeImagePath); if (commands.isEmpty()) return; try { - FileUtil.delete(Path.of(runtimeImagePath)); + FileUtil.delete(runtimeImagePath); } catch (IOException e) { - error(context, JavaCompilerBundle.message("packaging.jlink.build.task.run.time.image.deletion.failure")); + error(context, JpsBuildBundle.message("packaging.jlink.build.task.run.time.image.deletion.failure")); return; } final int errorCode = startProcess(context, commands, properties); if (errorCode != 0) { - error(context, JavaCompilerBundle.message("packaging.jlink.build.task.failure")); + error(context, JpsBuildBundle.message("packaging.jlink.build.task.failure")); return; } LOG.info("jlink task was finished"); } + private static boolean isValidJdk(@NotNull CompileContext context) { + Set> sdks = context.getProjectDescriptor().getProjectJavaSdks(); + JpsSdk javaSdk = null; + for (JpsSdk sdk : sdks) { + JpsSdkType sdkType = sdk.getSdkType(); + if (sdkType instanceof JpsJavaSdkType && JpsJavaSdkType.getJavaVersion(sdk) >= 9) { + javaSdk = sdk; + break; + } + } + return javaSdk != null; + } + @NotNull - private List buildCommands(@NotNull CompileContext context, - @NotNull JpsJLinkProperties properties, - @NotNull String runtimeImagePath) { + private static List buildCommands(@NotNull CompileContext context, + @NotNull JpsJLinkProperties properties, + @NotNull String artifactOutputPath, + @NotNull Path runtimeImagePath) { Set> sdks = context.getProjectDescriptor().getProjectJavaSdks(); if (sdks.isEmpty()) return Collections.emptyList(); - String artifactOutputPath = myArtifact.getOutputFilePath(); - ModuleFinder moduleFinder = ModuleFinder.of(Path.of(artifactOutputPath)); - String modulesSequence = moduleFinder.findAll().stream().map(mr -> mr.descriptor().name()).collect(Collectors.joining(",")); - if (modulesSequence.isEmpty()) { - error(context, JavaCompilerBundle.message("packaging.jlink.build.task.modules.not.found")); + String modulesSequence = getModulesSequence(artifactOutputPath); + if (StringUtil.isEmpty(modulesSequence)) { + error(context, JpsBuildBundle.message("packaging.jlink.build.task.modules.not.found")); return Collections.emptyList(); } JpsSdk javaSdk = sdks.iterator().next(); String sdkHomePath = javaSdk.getHomePath(); - String jLinkPath = sdkHomePath + File.separatorChar + "bin" + File.separatorChar + "jlink"; + String jLinkPath = Paths.get(sdkHomePath, "bin", "jlink").toString(); List commands = new ArrayList<>(); commands.add(jLinkPath); - if (properties.compressionLevel.hasCompression()) { + if (properties.compressionLevel != null && properties.compressionLevel.hasCompression()) { addOption(commands, "--compress", String.valueOf(properties.compressionLevel.myValue)); } if (properties.verbose) { @@ -109,11 +130,86 @@ public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvi commands.add(artifactOutputPath); commands.add("--add-modules"); commands.add(modulesSequence); - addOption(commands, "--output", runtimeImagePath); + addOption(commands, "--output", runtimeImagePath.toString()); LOG.info(String.join(" ", commands)); return commands; } + /** + * java.lang.module.ModuleFinder API is used here through reflection + * as idea modules used in the build process were left compatible with Java 8 by intention. + * Details are here: https://youtrack.jetbrains.com/issue/IDEA-243693 + */ + @Nullable + private static String getModulesSequence(@NotNull String artifactOutputPath) { + final Method of; + try { + of = Class.forName("java.lang.module.ModuleFinder").getMethod("of", Path[].class); + } + catch (NoSuchMethodException | ClassNotFoundException e) { + LOG.error("Couldn't get java.lang.module.ModuleFinder#of method"); + return null; + } + final Object finder; + try { + finder = of.invoke(null, new Object[]{new Path[]{Paths.get(artifactOutputPath)}}); + } + catch (IllegalAccessException | InvocationTargetException e) { + LOG.error("Couldn't call java.lang.module.ModuleFinder#of method"); + return null; + } + + final Method findAll; + try { + findAll = Class.forName("java.lang.module.ModuleFinder").getMethod("findAll"); + } + catch (NoSuchMethodException | ClassNotFoundException e) { + LOG.error("Couldn't get java.lang.module.ModuleFinder#findAll method"); + return null; + } + final Object allRefs; + try { + allRefs = findAll.invoke(finder); + } + catch (IllegalAccessException | InvocationTargetException e) { + LOG.error("Couldn't call java.lang.module.ModuleFinder#findAll method"); + return null; + } + + Set moduleRefs = (Set)allRefs; + if (moduleRefs.isEmpty()) return null; + + final Method descriptor; + try { + descriptor = Class.forName("java.lang.module.ModuleReference").getMethod("descriptor"); + } + catch (NoSuchMethodException | ClassNotFoundException e) { + LOG.error("Couldn't get java.lang.module.ModuleReference#descriptor method"); + return null; + } + final Method name; + try { + name = Class.forName("java.lang.module.ModuleDescriptor").getMethod("name"); + } + catch (NoSuchMethodException | ClassNotFoundException e) { + LOG.error("Couldn't get java.lang.module.ModuleDescriptor#name method"); + return null; + } + StringJoiner result = new StringJoiner(","); + try { + for (Object moduleRef : moduleRefs) { + String moduleName = ObjectUtils.tryCast(name.invoke(descriptor.invoke(moduleRef)), String.class); + if (moduleName == null) return null; + result.add(moduleName); + } + } + catch (IllegalAccessException | InvocationTargetException e) { + LOG.error("Couldn't call java.lang.module.ModuleReference#descriptor or name method"); + return null; + } + return result.toString(); + } + private static int startProcess(@NotNull CompileContext context, @NotNull List commands, @NotNull JpsJLinkProperties properties) { @@ -134,7 +230,6 @@ public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvi public void onTextAvailable(@NotNull ProcessEvent event, @NotNull Key outputType) { String message = StringUtil.trimTrailing(event.getText()); if (outputType == ProcessOutputTypes.STDERR) { - LOG.error(message, (Throwable)null); errorOutput.append(event.getText()); } else { @@ -163,9 +258,9 @@ public final class JLinkArtifactBuildTaskProvider extends ArtifactBuildTaskProvi } return result; } - catch (Exception e) { + catch (Throwable e) { error(context, e.getMessage()); - LOG.warn(e); + LOG.error(e); return -1; } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkArtifactType.java similarity index 92% rename from java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java rename to jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkArtifactType.java index 690b3a304a8d..9ab7c674fabb 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkArtifactType.java +++ b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkArtifactType.java @@ -1,5 +1,5 @@ // 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 com.intellij.packaging.impl.jlink; +package org.jetbrains.jps.packaging.jlink; import org.jetbrains.jps.model.artifact.JpsArtifactType; import org.jetbrains.jps.model.ex.JpsElementTypeBase; diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkModelSerializerExtension.java similarity index 97% rename from java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java rename to jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkModelSerializerExtension.java index 9b781a1d9e4e..2163df8baac7 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkModelSerializerExtension.java +++ b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkModelSerializerExtension.java @@ -1,5 +1,5 @@ // 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 com.intellij.packaging.impl.jlink; +package org.jetbrains.jps.packaging.jlink; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.XmlSerializer; diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkProperties.java similarity index 93% rename from java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java rename to jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkProperties.java index 198e00f7a85d..5bb1e8c93c0c 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/jlink/JpsJLinkProperties.java +++ b/jps/jps-builders/src/org/jetbrains/jps/packaging/jlink/JpsJLinkProperties.java @@ -1,5 +1,5 @@ // 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 com.intellij.packaging.impl.jlink; +package org.jetbrains.jps.packaging.jlink; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.ex.JpsElementBase; @@ -35,7 +35,7 @@ final class JpsJLinkProperties extends JpsElementBase { FIRST(1), SECOND(2); - public final int myValue; + final int myValue; CompressionLevel(int value) { this.myValue = value; }