diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index 8d5cfbe..91e7a93 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -61,7 +61,7 @@
         set(LOG4CXX_DLL_DIR "$<SHELL_PATH:$<TARGET_FILE_DIR:log4cxx>>")
         if(${testName} STREQUAL socketservertestcase)
             set_tests_properties(socketservertestcase PROPERTIES
-                ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >;PATH=${LOG4CXX_DLL_DIR}\;${APR_DLL_DIR}\;${APR_UTIL_DLL_DIR}"
+                ENVIRONMENT "SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE};PATH=${LOG4CXX_DLL_DIR}\;${APR_DLL_DIR}\;${APR_UTIL_DLL_DIR}"
             )
         else()
            set_tests_properties(${testName} PROPERTIES
@@ -71,7 +71,7 @@
     else()
         if(${testName} STREQUAL socketservertestcase)
             set_tests_properties(socketservertestcase PROPERTIES
-                ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >"
+                ENVIRONMENT "SOCKET_SERVER_PARAMETER_FILE=${START_SOCKET_SERVER_PARAMETER_FILE}"
             )
         else()
            set_tests_properties(${testName} PROPERTIES
diff --git a/src/test/cpp/net/socketserverstarter.cpp b/src/test/cpp/net/socketserverstarter.cpp
index 59ac0f8..fbb24c4 100644
--- a/src/test/cpp/net/socketserverstarter.cpp
+++ b/src/test/cpp/net/socketserverstarter.cpp
@@ -23,7 +23,7 @@
 #include <apr_strings.h>
 #include <apr_time.h>
 #include <log4cxx/helpers/pool.h>
-
+#include <fstream>
 
 using namespace log4cxx;
 
@@ -48,56 +48,114 @@
      apr_pool_t* pool = p.getAPRPool();
      char* cmd = NULL;
      apr_status_t stat = apr_env_get(&cmd, "SOCKET_SERVER_COMMAND", pool);
+     char* param_file = NULL;
+     stat = apr_env_get(&param_file, "SOCKET_SERVER_PARAMETER_FILE", pool);
+
+     // prepare to launch the server
+     //
+     apr_proc_t server_pid;
+     apr_procattr_t* attr = NULL;
+     stat = apr_procattr_create(&attr, pool);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_create failed");
+     stat = apr_procattr_io_set(attr, APR_NO_PIPE, APR_NO_PIPE, APR_NO_PIPE);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_io_set failed");
+
+     //fprintf(stdout, "SOCKET_SERVER_COMMAND=%s\n", cmd);
+     stat = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
+     if (stat != APR_SUCCESS)
+         LOGUNIT_FAIL("apr_procattr_cmdtype_set failed");
 
      if (cmd && *cmd)
      {
-          // prepare to launch the server
-          //
-          apr_proc_t server_pid;
-          apr_procattr_t* attr = NULL;
-          stat = apr_procattr_create(&attr, pool);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-          stat = apr_procattr_io_set(attr, APR_NO_PIPE, APR_NO_PIPE, APR_NO_PIPE);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-
-          //fprintf(stdout, "SOCKET_SERVER_COMMAND=%s\n", cmd);
-#ifdef SHELL_CMD_TYPE_WORKS
-          stat = apr_procattr_cmdtype_set(attr, APR_SHELLCMD);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
-          stat = apr_proc_create(&server_pid, cmd, NULL, NULL, attr, pool);
-#else
-          stat = apr_procattr_cmdtype_set(attr, APR_PROGRAM);
-          LOGUNIT_ASSERT(stat == APR_SUCCESS);
           // convert the space separated cmd string to the argument list
           //
-          char** args = (char**)apr_palloc(pool, 15 * sizeof(*args));
+          static const int MaxArgumentCount = 14;
+          char** argv = (char**)apr_palloc(pool, MaxArgumentCount + 1 * sizeof(*argv));
           char* pcmd = apr_pstrdup(pool, cmd);
           int i = 0;
-          for (; i < 14 && pcmd && *pcmd; ++i)
+          char separ = ' ';
+          for (; i < MaxArgumentCount && pcmd && *pcmd; ++i)
           {
-              args[i] = pcmd;
-              if (NULL != (pcmd = strchr(pcmd, ';')))
+              while(' ' == *pcmd)
               {
-                while(';' == *pcmd)
+                *pcmd = 0;
+                ++pcmd;
+              }
+              if ('"' == *pcmd || '\'' == *pcmd)
+              {
+                 separ = *pcmd;
+                 ++pcmd;
+              }
+              else
+                separ = ' ';
+              argv[i] = pcmd;
+              if (NULL != (pcmd = strchr(pcmd, separ)))
+              {
+                *pcmd = 0;
+                ++pcmd;
+                while(' ' == *pcmd)
                 {
                   *pcmd = 0;
                   ++pcmd;
                 }
               }
           }
-          args[i] = 0;
-          //fprintf(stdout, "starting=%s with %d arguments\n", args[0], i);
-          stat = apr_proc_create(&server_pid, args[0], args, NULL, attr, pool);
-#endif
+          argv[i] = 0;
+          stat = apr_proc_create(&server_pid, argv[0], argv, NULL, attr, pool);
 
 
           if (stat == APR_SUCCESS) // Allow server time to load
               apr_sleep(1000000); // 1 seconds
+          else
+              fprintf(stderr, "apr_proc_create failed to start %s\n", argv[0]);
+     }
+     else if (param_file && *param_file)
+     {
+          // Build the argument list from param_file
+          //
+          //fprintf(stderr, "Processing: %s\n", param_file);
+          std::ifstream in(param_file);
+          std::vector<std::string> params;
+          while (in)
+          {
+              params.push_back(std::string());
+              std::string& line = params.back();
+              std::getline(in, line);
+              while (!line.empty() && ' ' == line.back())
+                 line.pop_back();
+              if (line.empty())
+                  params.pop_back();
+          }
+          const char** argv = (const char**)apr_palloc(pool, params.size() + 1 * sizeof(*argv));
+          int i = 0;
+          for (; i < params.size(); ++i)
+          {
+              argv[i] = params[i].c_str();
+              //fprintf(stderr, "argv[%i]: %s\n", i, argv[i]);
+          }
+          argv[i] = 0;
+          stat = apr_proc_create(&server_pid, argv[0], argv, NULL, attr, pool);
+
+
+          if (stat == APR_SUCCESS) // Allow server time to load
+              apr_sleep(1000000); // 1 seconds
+          else
+              fprintf(stderr, "apr_proc_create failed to start %s\n", argv[0]);
       }
       else
-          fputs("The environment variable SOCKET_SERVER_COMMAND"
+      {
+          fputs("Either:\n", stderr);
+          fputs(" The environment variable SOCKET_SERVER_COMMAND"
                " must contain the server process path"
                " followed by space separated command arguments\n", stderr);
+          fputs("Or:\n", stderr);
+          fputs(" The file named in the environment variable SOCKET_SERVER_PARAMETER_FILE"
+               " must contain a line per argument starting with the server process path"
+               " followed by lines containing command arguments\n", stderr);
+          stat = -1;
+      }
 
       LOGUNIT_ASSERT(stat == APR_SUCCESS);
    }
diff --git a/src/test/java/CMakeLists.txt b/src/test/java/CMakeLists.txt
index ff4af4b..ee93ab6 100644
--- a/src/test/java/CMakeLists.txt
+++ b/src/test/java/CMakeLists.txt
@@ -14,5 +14,20 @@
           --class-path "${log4j_CLASSPATH}" ${SOCKET_SERVER_SOURCES}
   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 )
-set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR}:${log4j_CLASSPATH}" )
-set(START_SOCKET_SERVER_COMMAND ${Java_JAVA_EXECUTABLE} --class-path ${SOCKET_SERVER_CLASSPATH} org.apache.log4j.net.ShortSocketServer 8 input/socketServer PARENT_SCOPE)
+if(WIN32)
+  set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR};${log4j_CLASSPATH}")
+else()
+  set(SOCKET_SERVER_CLASSPATH "${CMAKE_CURRENT_BINARY_DIR}:${log4j_CLASSPATH}")
+endif()
+
+# Use a parameter file to avoid issues with processing ';'
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/StartSocketServerParams.txt
+"${Java_JAVA_EXECUTABLE}
+-classpath
+${SOCKET_SERVER_CLASSPATH}
+org.apache.log4j.net.ShortSocketServer
+8
+input/socketServer
+"
+)
+set(START_SOCKET_SERVER_PARAMETER_FILE ${CMAKE_CURRENT_BINARY_DIR}/StartSocketServerParams.txt PARENT_SCOPE)
