You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/02/25 19:20:34 UTC

incubator-juneau git commit: Allow REST microservices to try alternate ports when port is in use.

Repository: incubator-juneau
Updated Branches:
  refs/heads/master 0af286e95 -> 053b7c9ad


Allow REST microservices to try alternate ports when port is in use.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/053b7c9a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/053b7c9a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/053b7c9a

Branch: refs/heads/master
Commit: 053b7c9adf9ce4a9d63a3efa3a87b97102d6d561
Parents: 0af286e
Author: JamesBognar <ja...@apache.org>
Authored: Sat Feb 25 14:20:27 2017 -0500
Committer: JamesBognar <ja...@apache.org>
Committed: Sat Feb 25 14:20:27 2017 -0500

----------------------------------------------------------------------
 juneau-core/src/main/javadoc/overview.html      |  19 +++-
 juneau-examples-rest/examples.cfg               |   5 +-
 .../apache/juneau/examples/rest/Constants.java  |  28 -----
 .../juneau/examples/rest/RootResourcesTest.java |   4 +-
 .../juneau/examples/rest/SamplesRestClient.java |   8 +-
 .../juneau/examples/rest/TestMicroservice.java  |  19 +++-
 .../juneau/microservice/RestMicroservice.java   | 104 ++++++++++++++++++-
 .../apache/juneau/rest/client/RestClient.java   |  10 +-
 .../org/apache/juneau/rest/client/package.html  |   2 +-
 juneau-rest-test/juneau-rest-test.cfg           |   5 +-
 .../org/apache/juneau/rest/test/Constants.java  |  53 ----------
 .../juneau/rest/test/TestMicroservice.java      |  16 ++-
 .../apache/juneau/rest/test/TestRestClient.java |   8 +-
 .../org/apache/juneau/rest/test/UrisTest.java   |  24 ++---
 14 files changed, 183 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-core/src/main/javadoc/overview.html
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html
index c0c92ff..d1d3b4a 100644
--- a/juneau-core/src/main/javadoc/overview.html
+++ b/juneau-core/src/main/javadoc/overview.html
@@ -5667,6 +5667,23 @@
 				<li>Whitespace wasn't being ignored in some cases.
 			</ul>
 		</ul>
+		
+		<h6 class='topic'>org.apache.juneau.rest.client</h6>
+		<ul class='spaced-list'>
+			<li>{@link org.apache.juneau.rest.client.RestClient#setRootUrl(Object)} can now take in <code>URI</code> and <code>URL</code> objects.
+		</ul>
+		
+		<h6 class='topic'>org.apache.juneau.microservice</h6>
+		<ul class='spaced-list'>
+			<li><js>"REST/port"</js> configuration setting can now be a comma-limited list of port numbers to try.
+				<br>You can also specify one or more <code>0</code>s to try a random port.
+			<li>Methods added to {@link org.apache.juneau.microservice.RestMicroservice} class:
+			<ul>
+				<li>{@link org.apache.juneau.microservice.RestMicroservice#getPort()}
+				<li>{@link org.apache.juneau.microservice.RestMicroservice#getURI()}
+				<li>Override methods added from {@link org.apache.juneau.microservice.Microservice} class for easier method chaining.
+			</ul>
+		</ul>		
 	</div>
 	
 	
@@ -6393,7 +6410,7 @@
 				<ul>
 					<li>{@link org.apache.juneau.rest.client.RestClient#setBasicAuth(String,int,String,String)}
 					<li>{@link org.apache.juneau.rest.client.RestClient#logTo(Level,Logger)}
-					<li>{@link org.apache.juneau.rest.client.RestClient#setRootUrl(String)}
+					<li><code><del>RestClient.setRootUrl(String)</del></code>
 					<li>{@link org.apache.juneau.rest.client.RestClient#enableSSL(SSLOpts)}
 					<li>{@link org.apache.juneau.rest.client.RestClient#enableLaxSSL()}
 					<li>{@link org.apache.juneau.rest.client.RestClient#doCall(HttpMethod,Object,Object)}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-examples-rest/examples.cfg
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/examples.cfg b/juneau-examples-rest/examples.cfg
index bee6b91..6b221b6 100755
--- a/juneau-examples-rest/examples.cfg
+++ b/juneau-examples-rest/examples.cfg
@@ -23,7 +23,10 @@
 
 resources = org.apache.juneau.examples.rest.RootResources
 
-port = 10000
+# Ports to try.
+# 0 means try a random port.
+# 3 0's means try 3 random ports.
+port = 10000, 0, 0, 0
 
 # Authentication:  NONE, BASIC.
 authType = NONE

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/Constants.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/Constants.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/Constants.java
deleted file mode 100644
index 48cea08..0000000
--- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/Constants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// ***************************************************************************************************************************
-// * 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.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.examples.rest;
-
-public class Constants {
-
-	private static String juneauSampleUrl = System.getProperty("JUNO_SAMPLE_URL");
-
-	/**
-	 * Returns the value of the "JUNO_SAMPLE_URL" system property, or throws a {@link RuntimeException}
-	 * if it's not set.
-	 */
-	public static String getSampleUrl() {
-		if (juneauSampleUrl == null)
-			return "http://localhost:10000";
-		return juneauSampleUrl;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
index b3c7c98..0133292 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/RootResourcesTest.java
@@ -14,8 +14,6 @@ package org.apache.juneau.examples.rest;
 
 import static org.junit.Assert.*;
 
-import java.net.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.dto.swagger.*;
 import org.apache.juneau.html.*;
@@ -27,7 +25,7 @@ import org.junit.*;
 
 public class RootResourcesTest extends RestTestcase {
 
-	private static String path = URI.create(Constants.getSampleUrl()).getPath();              // /jazz/juneau/sample
+	private static String path = TestMicroservice.getURI().getPath();              // /jazz/juneau/sample
 	private static boolean debug = false;
 
 	private static RestClient jsonClient;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SamplesRestClient.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SamplesRestClient.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SamplesRestClient.java
index 13083d7..b3abd2b 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SamplesRestClient.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/SamplesRestClient.java
@@ -29,21 +29,21 @@ public class SamplesRestClient extends RestClient {
 
 	public SamplesRestClient(Class<? extends Serializer> s, Class<? extends Parser> p) throws InstantiationException {
 		super(s,p);
-		setRootUrl(Constants.getSampleUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public SamplesRestClient(Serializer s, Parser p) {
 		super(s,p);
-		setRootUrl(Constants.getSampleUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public SamplesRestClient() {
-		setRootUrl(Constants.getSampleUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public SamplesRestClient(CloseableHttpClient c) {
 		super(c);
-		setRootUrl(Constants.getSampleUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public static SSLConnectionSocketFactory getSSLSocketFactory() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
----------------------------------------------------------------------
diff --git a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
index 8cedc99..c7877d7 100644
--- a/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
+++ b/juneau-examples-rest/src/test/java/org/apache/juneau/examples/rest/TestMicroservice.java
@@ -12,16 +12,21 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
+import java.net.*;
 import java.util.*;
 
 import org.apache.juneau.microservice.*;
 
 /**
  * Utility class for starting up the examples microservice.
+ * <p>
+ * This class is NOT thread safe.
+ * 
  * @author james.bognar
  */
 public class TestMicroservice {
-	static Microservice microservice;
+	static RestMicroservice microservice;
+	static URI microserviceURI;
 
 	/**
 	 * Starts the microservice.
@@ -34,7 +39,7 @@ public class TestMicroservice {
 		try {
 			Locale.setDefault(Locale.US);
 			microservice = new RestMicroservice().setConfig("examples.cfg", false);
-			microservice.start();
+			microserviceURI = microservice.start().getURI();
 			return true;
 		} catch (Throwable e) {
 			// Probably already started.
@@ -44,6 +49,16 @@ public class TestMicroservice {
 	}
 
 	/**
+	 * Returns the URI of the microservice.
+	 * @return The URI of the microservice.
+	 */
+	public static URI getURI() {
+		if (microservice == null)
+			startMicroservice();
+		return microserviceURI;
+	}
+	
+	/**
 	 * Stops the microservice.
 	 */
 	public static void stopMicroservice() {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java
----------------------------------------------------------------------
diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java
index 36cef4e..56e9789 100755
--- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java
+++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java
@@ -13,7 +13,9 @@
 package org.apache.juneau.microservice;
 
 import java.io.*;
+import java.net.*;
 import java.util.*;
+import java.util.jar.*;
 import java.util.logging.*;
 
 import javax.servlet.*;
@@ -69,6 +71,7 @@ public class RestMicroservice extends Microservice {
 
 	Server server;
 	int port;
+	String contextPath;
 	Logger logger;
 
 	/**
@@ -143,6 +146,32 @@ public class RestMicroservice extends Microservice {
 	//--------------------------------------------------------------------------------
 	// RestMicroservice API methods.
 	//--------------------------------------------------------------------------------
+	
+	/**
+	 * Returns the port that this microservice started up on.
+	 * @return The port that this microservice started up on.
+	 */
+	public int getPort() {
+		return port;
+	}
+
+	/**
+	 * Returns the URI where this microservice is listening on.
+	 * @return The URI where this microservice is listening on.
+	 */
+	public URI getURI() {
+		String scheme = getConfig().getBoolean("REST/useSsl") ? "https" : "http";
+		String hostname = "localhost";
+		String ctx = "/".equals(contextPath) ? null : contextPath;
+		try {
+			hostname = InetAddress.getLocalHost().getHostName();
+		} catch (UnknownHostException e) {}
+		try {
+			return new URI(scheme, null, hostname, port, ctx, null, null);
+		} catch (URISyntaxException e) {
+			throw new RuntimeException(e);
+		}
+	}
 
 	/**
 	 * Initialize the logging for this microservice.
@@ -259,12 +288,14 @@ public class RestMicroservice extends Microservice {
 	 * 	<cs>[REST]</cs>
 	 *
 	 * 	<cc># The HTTP port number to use.
-	 * 	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	 * 	# Default is Rest-Port setting in manifest file, or 8000.
+	 * 	# Can also specify a comma-delimited lists of ports to try, including 0 meaning
+	 * 	# try a random port.</cc>
 	 * 	<ck>port</ck> = 10000
 	 *
 	 * 	<cc># The context root of the Jetty server.
 	 * 	# Default is Rest-ContextPath in manifest file, or "/".</cc>
-	 * 	<ck>contextPath</ck> = 10000
+	 * 	<ck>contextPath</ck> = 
 	 *
 	 * 	<cc># Authentication:  NONE, BASIC.
 	 * 	# Default is Rest-AuthType in manifest file, or NONE.</cc>
@@ -306,9 +337,16 @@ public class RestMicroservice extends Microservice {
 
 		ConfigFile cf = getConfig();
 		ObjectMap mf = getManifest();
+		
+		int[] ports = cf.getObject(int[].class, "REST/port", mf.get(int[].class, "Rest-Port", new int[]{8000}));
 
-		port = cf.getInt("REST/port", mf.getInt("Rest-Port", 8000));
-		String contextPath = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
+		port = findOpenPort(ports);
+		if (port == 0) {
+			System.err.println("Open port not found.  Tried " + JsonSerializer.DEFAULT_LAX.toString(ports));
+			System.exit(1);
+		}
+			
+		contextPath = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
 
 		if (cf.getBoolean("REST/useSsl")) {
 
@@ -354,19 +392,35 @@ public class RestMicroservice extends Microservice {
 
 		return server;
 	}
+	
+	private int findOpenPort(int[] ports) {
+		for (int port : ports) {
+			try {
+				// If port is 0, try a random port between ports[0] and 32767.
+				if (port == 0) 
+					port = new Random().nextInt(32767 - ports[0] + 1) + ports[0];
+				ServerSocket ss = new ServerSocket(port);
+				ss.close();
+				return port;
+			} catch (IOException e) {}
+		}
+		return 0;
+	}
 
 	/**
 	 * Method used to start the Jetty server created by {@link #createServer()}.
 	 * <p>
 	 * Subclasses can override this method to customize server startup.
 	 * 
+	 * @return The port that this server started on.
 	 * @throws Exception
 	 */
-	protected void startServer() throws Exception {
+	protected int startServer() throws Exception {
 		onStartServer();
 		server.start();
 		logger.warning("Server started on port " + port);
 		onPostStartServer();
+		return port;
 	}
 
 	/**
@@ -527,6 +581,46 @@ public class RestMicroservice extends Microservice {
 
 	
 	//--------------------------------------------------------------------------------
+	// Overridden methods.
+	//--------------------------------------------------------------------------------
+	
+	@Override /* Microservice */
+	public RestMicroservice setConfig(String cfPath, boolean create) throws IOException {
+		super.setConfig(cfPath, create);
+		return this;
+	}
+	
+	@Override /* Microservice */
+	public RestMicroservice setConfig(ConfigFile cf) {
+		super.setConfig(cf);
+		return this;
+	}
+
+	@Override /* Microservice */
+	public RestMicroservice setManifest(Manifest mf) {
+		super.setManifest(mf);
+		return this;
+	}
+
+	@Override /* Microservice */
+	public RestMicroservice setManifestContents(String...contents) throws IOException {
+		super.setManifestContents(contents);
+		return this;
+	}
+
+	@Override /* Microservice */
+	public RestMicroservice setManifest(File f) throws IOException {
+		super.setManifest(f);
+		return this;
+	}
+
+	@Override /* Microservice */
+	public RestMicroservice setManifest(Class<?> c) throws IOException {
+		super.setManifest(c);
+		return this;
+	}
+	
+	//--------------------------------------------------------------------------------
 	// Other methods.
 	//--------------------------------------------------------------------------------
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
----------------------------------------------------------------------
diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index de99eb0..6f175cc 100644
--- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -532,12 +532,14 @@ public class RestClient extends CoreApi {
 	 * This root URL is ignored on those methods if you pass in a {@link URL}, {@link URI}, or an absolute URL string.
 	 *
 	 * @param rootUrl The root URL to prefix to relative URL strings.  Trailing slashes are trimmed.
+	 * Usually a <code>String<code> but you can also pass in <code>URI</code> and <code>URL</code> objects as well.
 	 * @return This object (for method chaining).
 	 */
-	public RestClient setRootUrl(String rootUrl) {
-		if (rootUrl.endsWith("/"))
-			rootUrl = rootUrl.replaceAll("\\/$", "");
-		this.rootUrl = rootUrl;
+	public RestClient setRootUrl(Object rootUrl) {
+		String s = rootUrl.toString();
+		if (s.endsWith("/"))
+			s = s.replaceAll("\\/$", "");
+		this.rootUrl = s;
 		return this;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html
----------------------------------------------------------------------
diff --git a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html
index 7e9ee45..55797bb 100644
--- a/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html
+++ b/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/package.html
@@ -818,7 +818,7 @@
 	<h3 class='topic' onclick='toggle(this)'>1.8 - Other Useful Methods</h3>
 	<div class='topic'>
 		<p>
-			The {@link org.apache.juneau.rest.client.RestClient#setRootUrl(String)} method can be used to specify a root URL on 
+			The {@link org.apache.juneau.rest.client.RestClient#setRootUrl(Object)} method can be used to specify a root URL on 
 				all requests so that you don't have to use absolute paths on individual calls.
 		</p>
 		<p class='bcode'>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-test/juneau-rest-test.cfg
----------------------------------------------------------------------
diff --git a/juneau-rest-test/juneau-rest-test.cfg b/juneau-rest-test/juneau-rest-test.cfg
index 6d15a17..ff6d323 100644
--- a/juneau-rest-test/juneau-rest-test.cfg
+++ b/juneau-rest-test/juneau-rest-test.cfg
@@ -23,7 +23,10 @@
 
 resources = org.apache.juneau.rest.test.Root
 
-port = 10001
+# Ports to try.
+# 0 means try a random port.
+# 3 0's means try 3 random ports.
+port = 10001, 0, 0, 0
 
 # Authentication:  NONE, BASIC.
 authType = NONE

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
deleted file mode 100644
index a996b3b..0000000
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/Constants.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// ***************************************************************************************************************************
-// * 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.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.test;
-
-import java.net.*;
-
-
-public class Constants extends RestTestcase {
-
-	private static String juneauSampleUrl = System.getProperty("JUNO_SAMPLE_URL", "http://localhost:10000");
-	private static URI juneauSampleUri = (juneauSampleUrl == null ? null : URI.create(juneauSampleUrl));
-
-	/**
-	 * Returns the value of the "JUNO_SAMPLE_URL" system property, or throws a {@link RuntimeException}
-	 * if it's not set.
-	 */
-	public static String getJuneauSamplesUrl() {
-		if (juneauSampleUrl == null)
-			throw new RuntimeException("'JUNO_SAMPLE_URL' system property not set to URL of juneau.sample.war location.");
-		return juneauSampleUrl;
-	}
-
-	public static URI getJuneauSamplesUri() {
-		if (juneauSampleUri == null)
-			throw new RuntimeException("'JUNO_SAMPLE_URL' system property not set to URL of juneau.sample.war location.");
-		return juneauSampleUri;
-	}
-
-	private static String juneauServerTestUrl = System.getProperty("JUNO_SERVER_TEST_URL", "http://localhost:10001");
-	private static URI juneauServerTestUri = (juneauServerTestUrl == null ? null : URI.create(juneauServerTestUrl));
-
-	public static String getServerTestUrl() {
-		if (juneauServerTestUrl == null)
-			throw new RuntimeException("'JUNO_SERVER_TEST_URL' system property not set to URL of juneau.sample.war location.");
-		return juneauServerTestUrl;
-	}
-
-	public static URI getServerTestUri() {
-		if (juneauServerTestUri == null)
-			throw new RuntimeException("'JUNO_SERVER_TEST_URL' system property not set to URL of juneau.sample.war location.");
-		return juneauServerTestUri;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
index d7d45d9..84df9ec 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestMicroservice.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.test;
 
+import java.net.*;
 import java.util.*;
 
 import org.apache.juneau.microservice.*;
@@ -21,7 +22,8 @@ import org.apache.juneau.microservice.*;
  * @author james.bognar
  */
 public class TestMicroservice {
-	static Microservice microservice;
+	static RestMicroservice microservice;
+	static URI microserviceURI;
 
 	/**
 	 * Starts the microservice.
@@ -38,7 +40,7 @@ public class TestMicroservice {
 				.setManifestContents(
 					"Test-Entry: test-value"
 				);
-			microservice.start();
+			microserviceURI = microservice.start().getURI();
 			return true;
 		} catch (Throwable e) {
 			System.err.println(e); // NOT DEBUG
@@ -47,6 +49,16 @@ public class TestMicroservice {
 	}
 
 	/**
+	 * Returns the URI of the microservice.
+	 * @return The URI of the microservice.
+	 */
+	public static URI getURI() {
+		if (microservice == null)
+			startMicroservice();
+		return microserviceURI;
+	}
+
+	/**
 	 * Stops the microservice.
 	 */
 	public static void stopMicroservice() {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestRestClient.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestRestClient.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestRestClient.java
index 642d85d..05c491c 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestRestClient.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/TestRestClient.java
@@ -29,21 +29,21 @@ class TestRestClient extends RestClient {
 
 	public TestRestClient(Class<? extends Serializer> s, Class<? extends Parser> p) throws InstantiationException {
 		super(s,p);
-		setRootUrl(Constants.getServerTestUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public TestRestClient(Serializer s, Parser p) {
 		super(s,p);
-		setRootUrl(Constants.getServerTestUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public TestRestClient() {
-		setRootUrl(Constants.getServerTestUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public TestRestClient(CloseableHttpClient c) {
 		super(c);
-		setRootUrl(Constants.getServerTestUrl());
+		setRootUrl(TestMicroservice.getURI());
 	}
 
 	public static SSLConnectionSocketFactory getSSLSocketFactory() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/053b7c9a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
----------------------------------------------------------------------
diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
index 42ed4ab..57b929c 100644
--- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
+++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrisTest.java
@@ -14,8 +14,6 @@ package org.apache.juneau.rest.test;
 
 import static org.junit.Assert.*;
 
-import java.util.regex.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.rest.client.*;
@@ -26,9 +24,9 @@ import org.junit.*;
  */
 public class UrisTest extends RestTestcase {
 
-	private static String URL2 = Constants.getServerTestUrl() + "/testuris";           // /jazz/juneau/sample/testuris
-	private static int port = getPort(Constants.getServerTestUrl());                  // 9443
-	private static String path = Constants.getServerTestUri().getPath();              // /jazz/juneau/sample
+	private static String URL2 = TestMicroservice.getURI() + "/testuris";           // /jazz/juneau/sample/testuris
+	private static int port = TestMicroservice.getURI().getPort();                  // 9443
+	private static String path = TestMicroservice.getURI().getPath();              // /jazz/juneau/sample
 
 	//====================================================================================================
 	// testRoot - http://localhost:8080/sample/testuris
@@ -907,12 +905,12 @@ public class UrisTest extends RestTestcase {
 
 		client.closeQuietly();
 	}
-
-	private static int getPort(String url) {
-		Pattern p = Pattern.compile("\\:(\\d{2,5})");
-		Matcher m = p.matcher(url);
-		if (m.find())
-			return Integer.parseInt(m.group(1));
-		return -1;
-	}
+//
+//	private static int getPort(String url) {
+//		Pattern p = Pattern.compile("\\:(\\d{2,5})");
+//		Matcher m = p.matcher(url);
+//		if (m.find())
+//			return Integer.parseInt(m.group(1));
+//		return -1;
+//	}
 }