You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Dominik Stadler (JIRA)" <ji...@apache.org> on 2012/11/15 16:12:13 UTC

[jira] [Commented] (EXEC-54) Problem with argument containing spaces

    [ https://issues.apache.org/jira/browse/EXEC-54?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13498071#comment-13498071 ] 

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: https://issues.apache.org/jira/browse/EXEC-54
>             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, matcher.group(1));
> 	}
> {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: http://www.atlassian.com/software/jira