View | Details | Raw Unified | Return to bug 327193 | Differences between
and this patch

Collapse All | Expand All

(-)a/launching/org/eclipse/jdt/internal/launching/LongCommandLineLauncher.java (+45 lines)
Added Link Here
1
package org.eclipse.jdt.internal.launching;
2
3
import java.io.BufferedReader;
4
import java.io.File;
5
import java.io.FileInputStream;
6
import java.io.InputStreamReader;
7
import java.lang.reflect.Method;
8
import java.lang.reflect.Modifier;
9
import java.net.URL;
10
import java.net.URLClassLoader;
11
12
public class LongCommandLineLauncher {
13
	/**
14
	 * usage: LongCommandLineLauncher path/to/urls.lst realMainClass args... 
15
	 */
16
	public static void main(String[] args) throws Exception {
17
		URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
18
		Class clazz= URLClassLoader.class;
19
		Method method= clazz.getDeclaredMethod("addURL", new Class[] { URL.class }); //$NON-NLS-1$
20
		method.setAccessible(true);
21
22
		String urlsfile = args[0];
23
		File f = new File(urlsfile);
24
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8")); //$NON-NLS-1$
25
		String url;
26
		while(null != (url = reader.readLine())) {
27
			method.invoke(classLoader, new Object[] { new URL(url) });
28
		}
29
		reader.close();
30
		f.delete();
31
32
		String realMainClass = args[1];
33
		clazz = Class.forName(realMainClass);
34
		method = clazz.getMethod("main", new Class[] { args.getClass() }); //$NON-NLS-1$
35
		method.setAccessible(true);
36
		int mods = method.getModifiers();
37
		if (method.getReturnType() != void.class || !Modifier.isStatic(mods)
38
				|| !Modifier.isPublic(mods)) {
39
			throw new NoSuchMethodException("main"); //$NON-NLS-1$
40
		}
41
		String[] args2 = new String[args.length-2];
42
		System.arraycopy(args, 2, args2, 0, args2.length);
43
		method.invoke(null, new Object[] { args2 });
44
	}
45
}
(-)a/launching/org/eclipse/jdt/internal/launching/StandardVMDebugger.java (+6 lines)
Lines 203-217 public class StandardVMDebugger extends StandardVMRunner { Link Here
203
		addBootClassPathArguments(arguments, config);
203
		addBootClassPathArguments(arguments, config);
204
		
204
		
205
		String[] cp= config.getClassPath();
205
		String[] cp= config.getClassPath();
206
		int classpathArgIndex = -1;
206
		if (cp.length > 0) {
207
		if (cp.length > 0) {
207
			arguments.add("-classpath"); //$NON-NLS-1$
208
			arguments.add("-classpath"); //$NON-NLS-1$
209
			classpathArgIndex = arguments.size();
208
			arguments.add(convertClassPath(cp));
210
			arguments.add(convertClassPath(cp));
209
		}
211
		}
210
		
212
		
211
		
213
		
212
		
214
		
213
		arguments.add(config.getClassToLaunch());
215
		arguments.add(config.getClassToLaunch());
216
217
		shortenCommandLine(classpathArgIndex, arguments, cp, config);
218
214
		addArguments(config.getProgramArguments(), arguments);
219
		addArguments(config.getProgramArguments(), arguments);
220
215
		String[] cmdLine= new String[arguments.size()];
221
		String[] cmdLine= new String[arguments.size()];
216
		arguments.toArray(cmdLine);
222
		arguments.toArray(cmdLine);
217
		
223
		
(-)a/launching/org/eclipse/jdt/internal/launching/StandardVMRunner.java (-1 / +76 lines)
Lines 12-17 package org.eclipse.jdt.internal.launching; Link Here
12
12
13
13
14
import java.io.File;
14
import java.io.File;
15
import java.io.FileOutputStream;
16
import java.io.InputStream;
17
import java.io.OutputStream;
18
import java.io.OutputStreamWriter;
15
import java.util.ArrayList;
19
import java.util.ArrayList;
16
import java.util.Date;
20
import java.util.Date;
17
import java.util.Iterator;
21
import java.util.Iterator;
Lines 290-300 public class StandardVMRunner extends AbstractVMRunner { Link Here
290
		addBootClassPathArguments(arguments, config);
294
		addBootClassPathArguments(arguments, config);
291
		
295
		
292
		String[] cp= config.getClassPath();
296
		String[] cp= config.getClassPath();
297
		int classpathArgIndex = -1;
293
		if (cp.length > 0) {
298
		if (cp.length > 0) {
294
			arguments.add("-classpath"); //$NON-NLS-1$
299
			arguments.add("-classpath"); //$NON-NLS-1$
300
			classpathArgIndex = arguments.size();
295
			arguments.add(convertClassPath(cp));
301
			arguments.add(convertClassPath(cp));
296
		}
302
		}
297
		arguments.add(config.getClassToLaunch());
303
		arguments.add(config.getClassToLaunch());
304
305
		shortenCommandLine(classpathArgIndex, arguments, cp, config);
298
		
306
		
299
		String[] programArgs= config.getProgramArguments();
307
		String[] programArgs= config.getProgramArguments();
300
		addArguments(programArgs, arguments);
308
		addArguments(programArgs, arguments);
Lines 377-382 public class StandardVMRunner extends AbstractVMRunner { Link Here
377
		return env;
385
		return env;
378
	}
386
	}
379
387
388
	protected void shortenCommandLine(int classpathArgIndex, List arguments, String[] cp, VMRunnerConfiguration config) {
389
		if (classpathArgIndex > -1
390
				&& ((String)arguments.get(classpathArgIndex)).length() > 256 // can be shortened
391
				&& File.separatorChar == '\\' // is Windows
392
				)
393
		{
394
			int cmdLen = 0;
395
			for (int i = 0, sz = arguments.size(); i < sz; i++) {
396
				cmdLen += ((String)arguments.get(i)).length() + 1;
397
			}
398
			if (cmdLen > 30000) {
399
				File lclF;
400
				ArrayList lclShortCp = new ArrayList();
401
				try {
402
					lclF = File.createTempFile("eclipse", "tmp");  //$NON-NLS-1$//$NON-NLS-2$
403
					String lclTempDir = lclF.getAbsolutePath();
404
					lclF.delete();
405
					lclF.mkdir();
406
					Class lclClazz = LongCommandLineLauncher.class;
407
					String lclClassName = lclClazz.getName().replace('.', '/');
408
					String lclClassFile = lclClassName.concat(".class"); //$NON-NLS-1$
409
410
					String lclAbsClassFile = lclTempDir + '/' + lclClassFile;
411
					new File(lclAbsClassFile).getParentFile().mkdirs();
412
					ClassLoader lclCL = lclClazz.getClassLoader();
413
					InputStream lclIS = lclCL.getResourceAsStream(lclClassFile);
414
					OutputStream lclOS = new FileOutputStream(lclAbsClassFile);
415
					byte[] lclBuf = new byte[1024];
416
					int lclNB;
417
					while(-1 != (lclNB = lclIS.read(lclBuf, 0, lclBuf.length))) {
418
						lclOS.write(lclBuf, 0, lclNB);
419
					}
420
					lclOS.close();
421
					lclIS.close();
422
423
					lclF = File.createTempFile("urls", ".lst");  //$NON-NLS-1$//$NON-NLS-2$
424
					OutputStreamWriter lclExtractWriter = new OutputStreamWriter(new FileOutputStream(lclF), "UTF-8"); //$NON-NLS-1$
425
					String urlsfile = lclF.getAbsolutePath();
426
					File workingDir = getWorkingDir(config);
427
428
					for (int i = 0; i < cp.length; i++) {
429
						String cpEntry = cp[i];
430
						lclF = new File(cpEntry);
431
						if (workingDir != null && !lclF.isAbsolute())
432
							lclF = new File(new File(workingDir.getPath() + '/' + lclF.getPath()).getCanonicalPath());
433
434
						lclExtractWriter.append(lclF.toURI().toString());
435
						lclExtractWriter.append('\n');
436
					}
437
					lclExtractWriter.close();
438
					lclShortCp.add(lclTempDir);
439
					String[] shortCpA = new String[lclShortCp.size()];
440
					lclShortCp.toArray(shortCpA);
441
					arguments.set(classpathArgIndex, convertClassPath(shortCpA));
442
					String realMainClass = (String)arguments.get(classpathArgIndex+1);
443
					arguments.set(classpathArgIndex+1, lclClassName);
444
					ArrayList lclList = new ArrayList(2);
445
					lclList.add(urlsfile);
446
					lclList.add(realMainClass);
447
					arguments.addAll(classpathArgIndex+2, lclList);
448
				} catch(Exception e) {
449
					e.printStackTrace();
450
					// falback to normal
451
				}
452
			}
453
		}
454
	}
455
380
	/**
456
	/**
381
	 * Adds arguments to the bootpath
457
	 * Adds arguments to the bootpath
382
	 * @param arguments
458
	 * @param arguments
383
- 

Return to bug 327193