Uploaded image for project: 'Commons Exec'
  1. Commons Exec
  2. EXEC-54

Problem with argument containing spaces

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 1.1
    • None
    • Mac OsX 10.6.6, JVM 1.6.0

    Description

      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:

      	@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));
      	}
      

      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.

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            sgoeschl Siegfried Goeschl
            roesslerj Jeremias Rößler

            Dates

              Created:
              Updated:

              Slack

                Issue deployment