Make socketservertestcase work independently of ant build
diff --git a/build.xml b/build.xml
index 8c7fed7..6e1a811 100644
--- a/build.xml
+++ b/build.xml
@@ -229,51 +229,6 @@
 		</delete>
 	</target>
 
-	<target	name="run-socketserver"
-			depends="clean-output"
-			description="Runs SocketServer test">
-		<property environment="env" />
-		<mkdir dir="${tests.output.dir}" />
-		<delete>
-			<fileset	dir="${tests.output.dir}"
-						includes="*"
-			/>
-		</delete>
-		<mkdir dir="target/test-classes" />
-		<javac	srcdir="src/test/java"
-				includes="org/apache/log4j/net/ShortSocketServer.java"
-				destdir="target/test-classes"
-				classpath="${log4j.jar}"
-		/>
-		<parallel>
-			<java	classname="org.apache.log4j.net.ShortSocketServer"
-					fork="yes" dir="src/test/resources"
-					classpath="target/test-classes:${log4j.jar}">
-				<arg value="8" />
-				<arg value="input/socketServer" />
-			</java>
-			<sequential>
-				<sleep seconds="2" />
-				<exec	executable="${testsuite.exe}"
-						dir="${tests.resources.dir}"
-						failonerror="true">
-					<arg value="-v" />
-					<arg value="socketservertestcase" />
-
-					<env	key="LD_LIBRARY_PATH"
-							value="${log4cxx.lib.dir}:${apr.lib.dir}:${apr-util.lib.dir}:${env.LD_LIBRARY_PATH}"
-					/>
-					<env	key="DYLD_LIBRARY_PATH"
-							value="${log4cxx.lib.dir}:${apr.lib.dir}:${apr-util.lib.dir}:${env.DYLD_LIBRARY_PATH}"
-					/>
-					<env	key="Path"
-							value="${log4cxx.lib.dir};${env.Path}"
-					/>
-				</exec>
-			</sequential>
-		</parallel>
-	</target>
-
 	<target	name="apidocs"
 			description="Build log4cxx manual">
 		<copy	file="${base.dir}/src/site/doxy/Doxyfile.in"
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
index da8ed95..42ff357 100644
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -1 +1,5 @@
-add_subdirectory(cpp)
\ No newline at end of file
+find_package(Java COMPONENTS Development)
+if(Java_Development_FOUND)
+  add_subdirectory(java)
+endif(Java_Development_FOUND)
+add_subdirectory(cpp)
diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt
index cc5d250..bbe01e3 100644
--- a/src/test/cpp/CMakeLists.txt
+++ b/src/test/cpp/CMakeLists.txt
@@ -56,9 +56,16 @@
         COMMAND ${testName} -v
         WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../resources
     )
-    set_tests_properties(${testName} PROPERTIES
-        ENVIRONMENT "TOTO=wonderful;key1=value1;key2=value2"
-    )
+
+    if(${testName} STREQUAL socketservertestcase)
+        set_tests_properties(socketservertestcase PROPERTIES
+            ENVIRONMENT "SOCKET_SERVER_COMMAND=$<JOIN:${START_SOCKET_SERVER_COMMAND}, >"
+        )
+    else()
+       set_tests_properties(${testName} PROPERTIES
+            ENVIRONMENT "TOTO=wonderful;key1=value1;key2=value2"
+       )
+    endif()
     if(WIN32)
       set_tests_properties(${testName} PROPERTIES ENVIRONMENT
         "PATH=$<SHELL_PATH:$<TARGET_FILE_DIR:log4cxx>>$<SEMICOLON>$ENV{PATH}"
diff --git a/src/test/cpp/net/CMakeLists.txt b/src/test/cpp/net/CMakeLists.txt
index 888dec6..a11e603 100644
--- a/src/test/cpp/net/CMakeLists.txt
+++ b/src/test/cpp/net/CMakeLists.txt
@@ -3,7 +3,6 @@
 set(NET_TESTS 
     socketappendertestcase
     sockethubappendertestcase
-    socketservertestcase
     syslogappendertestcase
     telnetappendertestcase
     xmlsocketappendertestcase
@@ -14,4 +13,9 @@
 foreach(fileName IN LISTS NET_TESTS)
     add_executable(${fileName} "${fileName}.cpp")
 endforeach()
+if(Java_Development_FOUND)
+    add_executable(socketservertestcase socketserverstarter.cpp socketservertestcase.cpp)
+    add_dependencies(socketservertestcase test-classes)
+    list(APPEND NET_TESTS socketservertestcase)
+endif(Java_Development_FOUND)
 set(ALL_LOG4CXX_TESTS ${ALL_LOG4CXX_TESTS} ${NET_TESTS} PARENT_SCOPE)
diff --git a/src/test/cpp/net/socketserverstarter.cpp b/src/test/cpp/net/socketserverstarter.cpp
new file mode 100644
index 0000000..43e9d56
--- /dev/null
+++ b/src/test/cpp/net/socketserverstarter.cpp
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "../logunit.h"
+
+#include <apr_thread_proc.h>
+#include <apr_env.h>
+#include <apr_file_io.h>
+#include <apr_strings.h>
+#include <apr_time.h>
+#include <log4cxx/helpers/pool.h>
+
+
+using namespace log4cxx;
+
+LOGUNIT_CLASS(SocketServerStarter)
+{
+   LOGUNIT_TEST_SUITE(SocketServerStarter);
+      LOGUNIT_TEST(startServer);
+   LOGUNIT_TEST_SUITE_END();
+   
+public:
+   void setUp()
+   {
+   }
+
+   void tearDown()
+   {
+   }
+   
+   void startServer()
+   {
+     helpers::Pool p;
+     apr_pool_t* pool = p.getAPRPool();
+     char* cmd = NULL;
+     apr_status_t stat = apr_env_get(&cmd, "SOCKET_SERVER_COMMAND", pool);
+
+     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));
+          char* pcmd = apr_pstrdup(pool, cmd);
+          int i = 0;
+          for (; i < 14 && pcmd && *pcmd; ++i)
+          {
+              args[i] = pcmd;
+              if (NULL != (pcmd = strchr(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
+
+
+          if (stat == APR_SUCCESS) // Allow server time to load
+              apr_sleep(1000000); // 1 seconds
+      }
+      else
+          fputs("The environment variable SOCKET_SERVER_COMMAND"
+               " must contain the server process path"
+               " followed by space separated command arguments\n", stderr);
+
+      LOGUNIT_ASSERT(stat == APR_SUCCESS);
+   }
+};
+
+
+LOGUNIT_TEST_SUITE_REGISTRATION(SocketServerStarter)
+
diff --git a/src/test/cpp/net/socketservertestcase.cpp b/src/test/cpp/net/socketservertestcase.cpp
index ce4444f..d46b378 100644
--- a/src/test/cpp/net/socketservertestcase.cpp
+++ b/src/test/cpp/net/socketservertestcase.cpp
@@ -38,7 +38,6 @@
 #include "../logunit.h"
 #include <log4cxx/spi/loggerrepository.h>
 
-
 //Define INT64_C for compilers that don't have it
 #if (!defined(INT64_C))
 #define INT64_C(value)  value ## LL
@@ -478,4 +477,4 @@
 const File SocketServerTestCase::TEMP("output/temp");
 const File SocketServerTestCase::FILTERED("output/filtered");
 
-LOGUNIT_TEST_SUITE_REGISTRATION_DISABLED(SocketServerTestCase)
+LOGUNIT_TEST_SUITE_REGISTRATION(SocketServerTestCase)
diff --git a/src/test/java/CMakeLists.txt b/src/test/java/CMakeLists.txt
new file mode 100644
index 0000000..ff4af4b
--- /dev/null
+++ b/src/test/java/CMakeLists.txt
@@ -0,0 +1,18 @@
+include(FetchContent)
+FetchContent_Declare(log4j
+  URL https://www-us.apache.org/dist/logging/log4j/1.2.17/log4j-1.2.17.tar.gz
+  URL_HASH MD5=8218714e41ee0c6509dcfeafa2e1f53f
+)
+FetchContent_GetProperties(log4j)
+if(NOT log4j_POPULATED)
+  FetchContent_Populate(log4j)
+endif()
+set(log4j_CLASSPATH "${log4j_SOURCE_DIR}/log4j-1.2.17.jar" )
+set(SOCKET_SERVER_SOURCES org/apache/log4j/net/ShortSocketServer.java)
+add_custom_target(test-classes
+  COMMAND ${Java_JAVAC_EXECUTABLE} -d ${CMAKE_CURRENT_BINARY_DIR}
+          --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)