mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
collapse "-D" vm parameters if command line is too long (IDEA-76030)
This commit is contained in:
@@ -32,6 +32,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CommandLineWrapper {
|
||||
private static final String PREFIX = "-D";
|
||||
|
||||
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
|
||||
IllegalAccessException, IOException, InstantiationException {
|
||||
@@ -54,9 +55,41 @@ public class CommandLineWrapper {
|
||||
reader.close();
|
||||
}
|
||||
file.delete();
|
||||
String progClass = args[1];
|
||||
String[] progArgs = new String[args.length - 2];
|
||||
System.arraycopy(args, 2, progArgs, 0, progArgs.length);
|
||||
|
||||
int startArgsIdx = 2;
|
||||
if (args[1].equals("@vm_params")) {
|
||||
startArgsIdx = 4;
|
||||
final File vmParamsFile = new File(args[2]);
|
||||
final BufferedReader vmParamsReader = new BufferedReader(new FileReader(vmParamsFile));
|
||||
try {
|
||||
while (vmParamsReader.ready()) {
|
||||
final String vmParam = vmParamsReader.readLine().trim();
|
||||
final int eqIdx = vmParam.indexOf("=");
|
||||
String vmParamName;
|
||||
String vmParamValue;
|
||||
|
||||
if (eqIdx > -1 && eqIdx < vmParam.length() - 1) {
|
||||
vmParamName = vmParam.substring(0, eqIdx);
|
||||
vmParamValue = vmParam.substring(eqIdx + 1);
|
||||
} else {
|
||||
vmParamName = vmParam;
|
||||
vmParamValue = "";
|
||||
}
|
||||
vmParamName = vmParamName.trim();
|
||||
if (vmParamName.startsWith(PREFIX)) {
|
||||
vmParamName = vmParamName.substring(PREFIX.length());
|
||||
System.setProperty(vmParamName, vmParamValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
vmParamsReader.close();
|
||||
}
|
||||
vmParamsFile.delete();
|
||||
}
|
||||
String progClass = args[startArgsIdx - 1];
|
||||
String[] progArgs = new String[args.length - startArgsIdx];
|
||||
System.arraycopy(args, startArgsIdx, progArgs, 0, progArgs.length);
|
||||
ClassLoader loader = new URLClassLoader((URL[])urls.toArray(new URL[urls.size()]), null);
|
||||
final String classloader = System.getProperty("java.system.class.loader");
|
||||
if (classloader != null) {
|
||||
|
||||
@@ -40,6 +40,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.io.*;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.UnsupportedCharsetException;
|
||||
import java.util.List;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.Manifest;
|
||||
@@ -147,32 +148,13 @@ public class JdkUtil {
|
||||
commandLine.setExePath(exePath);
|
||||
|
||||
ParametersList parametersList = javaParameters.getVMParametersList();
|
||||
commandLine.addParameters(parametersList.getList());
|
||||
|
||||
// Value of -Dfile.encoding and charset of GeneralCommandLine should be in sync in order process's input and output be correctly handled.
|
||||
String encoding = parametersList.getPropertyValue("file.encoding");
|
||||
if (encoding == null) {
|
||||
Charset charset = javaParameters.getCharset();
|
||||
if (charset == null) charset = EncodingManager.getInstance().getDefaultCharset();
|
||||
if (charset == null) charset = CharsetToolkit.getDefaultSystemCharset();
|
||||
commandLine.addParameter("-Dfile.encoding=" + charset.name());
|
||||
commandLine.setCharset(charset);
|
||||
}
|
||||
else {
|
||||
try {
|
||||
Charset charset = Charset.forName(encoding);
|
||||
commandLine.setCharset(charset);
|
||||
}
|
||||
catch (UnsupportedCharsetException ignore) {
|
||||
}
|
||||
}
|
||||
|
||||
commandLine.setEnvParams(javaParameters.getEnv());
|
||||
commandLine.setPassParentEnvs(javaParameters.isPassParentEnvs());
|
||||
|
||||
final Class commandLineWrapper;
|
||||
if (forceDynamicClasspath && (commandLineWrapper = getCommandLineWrapperClass()) != null) {
|
||||
File classpathFile = null;
|
||||
File vmParamsFile = null;
|
||||
if(!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){
|
||||
try {
|
||||
classpathFile = FileUtil.createTempFile("classpath", null);
|
||||
@@ -199,16 +181,55 @@ public class JdkUtil {
|
||||
catch (IOException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
|
||||
try {
|
||||
vmParamsFile = FileUtil.createTempFile("vm_params", null);
|
||||
final PrintWriter writer = new PrintWriter(vmParamsFile);
|
||||
try {
|
||||
for (String param : parametersList.getList()) {
|
||||
if (param.startsWith("-D")) {
|
||||
writer.println(param);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
writer.close();
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
final List<String> list = parametersList.getList();
|
||||
if (vmParamsFile == null) {
|
||||
commandLine.addParameters(list);
|
||||
} else {
|
||||
for (String param : list) {
|
||||
if (!param.trim().startsWith("-D")) {
|
||||
commandLine.addParameter(param);
|
||||
}
|
||||
}
|
||||
}
|
||||
appendEncoding(javaParameters, commandLine, parametersList);
|
||||
if (classpathFile != null) {
|
||||
commandLine.addParameter(commandLineWrapper.getName());
|
||||
commandLine.addParameter(classpathFile.getAbsolutePath());
|
||||
}
|
||||
if (vmParamsFile != null) {
|
||||
commandLine.addParameter("@vm_params");
|
||||
commandLine.addParameter(vmParamsFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
else if(!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){
|
||||
else if (!parametersList.hasParameter("-classpath") && !parametersList.hasParameter("-cp")){
|
||||
commandLine.addParameters(parametersList.getList());
|
||||
appendEncoding(javaParameters, commandLine, parametersList);
|
||||
|
||||
commandLine.addParameter("-classpath");
|
||||
commandLine.addParameter(javaParameters.getClassPath().getPathsString());
|
||||
} else {
|
||||
commandLine.addParameters(parametersList.getList());
|
||||
appendEncoding(javaParameters, commandLine, parametersList);
|
||||
}
|
||||
|
||||
final String mainClass = javaParameters.getMainClass();
|
||||
@@ -220,6 +241,26 @@ public class JdkUtil {
|
||||
return commandLine;
|
||||
}
|
||||
|
||||
private static void appendEncoding(SimpleJavaParameters javaParameters, GeneralCommandLine commandLine, ParametersList parametersList) {
|
||||
// Value of -Dfile.encoding and charset of GeneralCommandLine should be in sync in order process's input and output be correctly handled.
|
||||
String encoding = parametersList.getPropertyValue("file.encoding");
|
||||
if (encoding == null) {
|
||||
Charset charset = javaParameters.getCharset();
|
||||
if (charset == null) charset = EncodingManager.getInstance().getDefaultCharset();
|
||||
if (charset == null) charset = CharsetToolkit.getDefaultSystemCharset();
|
||||
commandLine.addParameter("-Dfile.encoding=" + charset.name());
|
||||
commandLine.setCharset(charset);
|
||||
}
|
||||
else {
|
||||
try {
|
||||
Charset charset = Charset.forName(encoding);
|
||||
commandLine.setCharset(charset);
|
||||
}
|
||||
catch (UnsupportedCharsetException ignore) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Class getCommandLineWrapperClass() {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user