commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dominik Stadler (JIRA)" <>
Subject [jira] [Commented] (EXEC-54) Problem with argument containing spaces
Date Thu, 15 Nov 2012 15:12:13 GMT


Dominik Stadler commented on EXEC-54:

This just hit me for the second time and it was really a pain to debug. I see that both ways
of doing quoting and not doing quoting have their use, what I don't understand is the default
of doing this quote-handling always unless turned off by passing "false" to addArgument().

Why is it necessary when you later pass a String[]-Array with separate arguments to the Runtime.exec()
method in Java13CommandLauncher anyway. Isn't this also supposed to handle blanks correctly
and thus we are doing the same thing twice here?

I see that other Launcher-Implementations use versions where they pass one String to the exec-call,
so it seems the question of quoting is dependent on which exact Launcher you are using, shouldn't
the default be based on that then?
> Problem with argument containing spaces
> ---------------------------------------
>                 Key: EXEC-54
>                 URL:
>             Project: Commons Exec
>          Issue Type: Bug
>    Affects Versions: 1.1
>         Environment: Mac OsX 10.6.6, JVM 1.6.0
>            Reporter: Jeremias Rößler
>            Assignee: Siegfried Goeschl
>              Labels: arguments, quotes, spaces
> I am new to Commons Exec, so this could also be an error in usage, but... 
> When I use the {{CommandLine}} class to add a argument that contains spaces, some quotes
are added and are then part of the argument that is given.
> For example: When I call {{java "what version"}} I get {{java.lang.NoClassDefFoundError:
what version}}, and when I call {{java "\"what version\""}} (which contains escaped quotes,
that are part of the command line argument itself), I get {{java.lang.NoClassDefFoundError:
"what version"}}.
> So the following test fails, because as you can see in the last line, Apache Exec is
producing the latter version where it should have produced the first version:
> {code:java}
> 	@Test
> 	public void testArgumentQuoting() throws Exception {
> 		String argument = "what version";
> 		DefaultExecutor executor = new DefaultExecutor();
> 		DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
> 		ByteArrayOutputStream out = new ByteArrayOutputStream();
> 		PumpStreamHandler streamHandler = new PumpStreamHandler(out, out);
> 		executor.setStreamHandler(streamHandler);
> 		CommandLine cmdLine = new CommandLine("java");
> 		cmdLine.addArgument(argument);
> 		executor.execute(cmdLine, resultHandler);
> 		resultHandler.waitFor();
> 		String resultPattern = "Exception in thread \"main\" java\\.lang\\.NoClassDefFoundError:
([\\w \"]+)";
> 		Pattern pattern = Pattern.compile(resultPattern);
> 		Matcher matcher = pattern.matcher(out.toString());
> 		Assert.assertTrue(matcher.find());
> 		// Note: Result should be <what version> and NOT <"what version">!
> 		Assert.assertEquals(argument,;
> 	}
> {code} 
> Note that the same test passes if the space is removed from the argument. Please also
note, that I am not trying to start an external Java process, but this is merely an example
that I assume will work on every developers machine.

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:

View raw message