You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by ma...@apache.org on 2023/04/09 08:25:11 UTC

[opennlp-sandbox] branch modernize-jersey-binding-in-several-sandbox-components created (now 6b60194)

This is an automated email from the ASF dual-hosted git repository.

mawiesne pushed a change to branch modernize-jersey-binding-in-several-sandbox-components
in repository https://gitbox.apache.org/repos/asf/opennlp-sandbox.git


      at 6b60194  modernizes several components to rely on a more recent version of Jersey 2.x instead of ancient 1.x versions - tagging-server - corpus-server and its components - caseditor-corpus-server-plugin - wikinews-importer (Jersey never used/required here)

This branch includes the following new commits:

     new 6b60194  modernizes several components to rely on a more recent version of Jersey 2.x instead of ancient 1.x versions - tagging-server - corpus-server and its components - caseditor-corpus-server-plugin - wikinews-importer (Jersey never used/required here)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[opennlp-sandbox] 01/01: modernizes several components to rely on a more recent version of Jersey 2.x instead of ancient 1.x versions - tagging-server - corpus-server and its components - caseditor-corpus-server-plugin - wikinews-importer (Jersey never used/required here)

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mawiesne pushed a commit to branch modernize-jersey-binding-in-several-sandbox-components
in repository https://gitbox.apache.org/repos/asf/opennlp-sandbox.git

commit 6b60194db0c072916aeef410bf0e7b5b8d5a5888
Author: Martin Wiesner <ma...@hs-heilbronn.de>
AuthorDate: Sun Apr 9 10:25:03 2023 +0200

    modernizes several components to rely on a more recent version of Jersey 2.x instead of ancient 1.x versions
    - tagging-server
    - corpus-server and its components
    - caseditor-corpus-server-plugin
    - wikinews-importer (Jersey never used/required here)
---
 caseditor-corpus-server-plugin/pom.xml             |  32 +++++--
 .../caseditor/DefaultCasDocumentProvider.java      |  49 +++++-----
 .../caseditor/SearchCorpusServerJob.java           |  42 ++++-----
 .../corpus_server/caseditor/TaskQueueView.java     |  25 +++--
 corpus-server/corpus-server-connector/pom.xml      |  43 ++++++---
 .../corpus_server/connector/CSCasWriter.java       |  77 ++++++++-------
 .../connector/CSQueueCollectionReader.java         | 105 +++++++++------------
 .../opennlp/corpus_server/connector/UimaUtil.java  |   6 +-
 corpus-server/corpus-server-core/feature.xml       |  23 ++---
 corpus-server/corpus-server-core/pom.xml           |  29 +++++-
 .../opennlp/corpus_server/CorpusServerBundle.java  |   2 +-
 corpus-server/corpus-server-impl/pom.xml           |   6 +-
 corpus-server/corpus-server-tools/pom.xml          |  28 ++++--
 .../opennlp/corpus_server/tools/CASImporter.java   |  35 +++----
 .../opennlp/corpus_server/tools/CorpusBackup.java  |  82 ++++++++--------
 .../opennlp/corpus_server/tools/CreateCorpus.java  |  63 ++++++-------
 .../corpus_server/tools/CreateTaskQueue.java       |  33 ++++---
 .../opennlp/corpus_server/tools/DropCorpus.java    |  37 ++++----
 .../opennlp/corpus_server/tools/FileUtil.java      |   3 +-
 .../opennlp/corpus_server/tools/RemoveCAS.java     |  26 ++---
 .../corpus_server/tools/ReplaceTypeSystem.java     |  51 +++++-----
 .../opennlp/corpus_server/tools/SearchCorpus.java  |  42 ++++-----
 corpus-server/pom.xml                              |  87 +++++++++--------
 mahout-addon/pom.xml                               |  50 ++++++++++
 pom.xml                                            |  17 +++-
 tagging-server/feature.xml                         |  11 ++-
 tagging-server/pom.xml                             |  65 ++++++++-----
 .../tagging_server/TaggingServerBundle.java        |   3 +-
 wikinews-importer/pom.xml                          |  15 ---
 29 files changed, 594 insertions(+), 493 deletions(-)

diff --git a/caseditor-corpus-server-plugin/pom.xml b/caseditor-corpus-server-plugin/pom.xml
index 1bce6c1..451e0b7 100644
--- a/caseditor-corpus-server-plugin/pom.xml
+++ b/caseditor-corpus-server-plugin/pom.xml
@@ -66,17 +66,29 @@
 		</dependency>
 
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
-		    <version>1.19.4</version>
+			<groupId>org.glassfish.jersey.core</groupId>
+			<artifactId>jersey-client</artifactId>
+			<version>${jersey-client.version}</version>
 		</dependency>
 
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
-		    <version>1.19.4</version>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jettison</artifactId>
+			<version>${jersey-server.version}</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.codehaus.jettison</groupId>
+					<artifactId>jettison</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
-		
+
+		<dependency>
+			<groupId>org.codehaus.jettison</groupId>
+			<artifactId>jettison</artifactId>
+			<version>${jettison.version}</version>
+		</dependency>
+
 		<!-- UIMA dependencies -->
 		<!-- don't depend on the runtime plugin, instead, depend on the parts needed -->
 		<dependency>
@@ -223,8 +235,7 @@
 									org.eclipse.ui,
 									org.eclipse.ui.workbench,
 									org.eclipse.core.runtime,
-									org.eclipse.core.resources,
-									org.junit4;bundle-version="4.13.2";resolution:=optional
+									org.eclipse.core.resources
 								</Require-Bundle>
 								<Import-Package>
 									!org.eclipse.jface.text,
@@ -238,7 +249,8 @@
 									!org.eclipse.ui.model,
 									!org.eclipse.ui.part,
 									!org.eclipse.core.runtime,
-									com.sun.jersey.api.client.config,
+									org.codehaus.jettison,
+									org.glassfish.jersey.client.config,
 									*
 								</Import-Package>
 							</instructions>
diff --git a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/DefaultCasDocumentProvider.java b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/DefaultCasDocumentProvider.java
index aeda502..d7da8bd 100644
--- a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/DefaultCasDocumentProvider.java
+++ b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/DefaultCasDocumentProvider.java
@@ -29,7 +29,12 @@ import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.apache.uima.ResourceSpecifierFactory;
 import org.apache.uima.UIMAFramework;
@@ -60,10 +65,8 @@ import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.preference.PreferenceStore;
 import org.eclipse.swt.widgets.Composite;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.ClientResponse;
 
 public class DefaultCasDocumentProvider extends
         org.apache.uima.caseditor.editor.CasDocumentProvider {
@@ -127,23 +130,22 @@ public class DefaultCasDocumentProvider extends
       //       the user if downloading the CAS fails?
       
       CorpusServerCasEditorInput casInput = (CorpusServerCasEditorInput) element;
-      
-      Client client = Client.create();
-      client.setReadTimeout(READ_TIMEOUT);
-      WebResource webResource = client.resource(casInput.getServerUrl());
-      
+
+      Client c = ClientBuilder.newClient();
+      c.property(ClientProperties.READ_TIMEOUT, READ_TIMEOUT);
+      WebTarget webResource = c.target(casInput.getServerUrl());
+
       // Note: The type system could be cached to avoid downloading it
       //       for every opened CAS, a time stamp can be used to detect
       //       if it has been changed or not.
       
       ClientResponse tsResponse = webResource.path("_typesystem")
-              .accept(MediaType.TEXT_XML)
-              // TODO: How to fix this? Shouldn't accept do it?
+              .request(MediaType.TEXT_XML)
               .header("Content-Type", MediaType.TEXT_XML)
               .get(ClientResponse.class);
       
       TypeSystemDescription tsDesc = null;
-      try (InputStream tsIn = tsResponse.getEntityInputStream()) {
+      try (InputStream tsIn = tsResponse.getEntityStream()) {
         tsDesc = createTypeSystemDescription(tsIn);
       }
       catch (IOException e) {
@@ -159,13 +161,12 @@ public class DefaultCasDocumentProvider extends
       
       ClientResponse casResponse;
       casResponse = webResource.path(URLEncoder.encode(casInput.getName(), StandardCharsets.UTF_8))
-          .accept(MediaType.TEXT_XML)
-          // TODO: How to fix this? Shouldn't accept do it?
+          .request(MediaType.TEXT_XML)
           .header("Content-Type", MediaType.TEXT_XML)
           .get(ClientResponse.class);
 
       org.apache.uima.caseditor.editor.ICasDocument doc;
-      try (InputStream casIn = casResponse.getEntityInputStream()) {
+      try (InputStream casIn = casResponse.getEntityStream()) {
         IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
         IPath pluginStatePath = CorpusServerPlugin.getDefault().getStateLocation();
         IPath tempPath = pluginStatePath.append(casInput.getName()).addFileExtension(MediaType.TEXT_XML);
@@ -200,19 +201,21 @@ public class DefaultCasDocumentProvider extends
         ByteArrayOutputStream outStream = new ByteArrayOutputStream(40000); 
         documentImpl.serialize(outStream);
         
-        Client client = Client.create();
-        client.setReadTimeout(READ_TIMEOUT);
-        WebResource webResource = client.resource(casInput.getServerUrl());
+        Client c = ClientBuilder.newClient();
+        c.property(ClientProperties.READ_TIMEOUT, READ_TIMEOUT);
+        WebTarget webResource = c.target(casInput.getServerUrl());
         
         byte[] xmiBytes = outStream.toByteArray();
         
         String encodedCasId = URLEncoder.encode(casInput.getName(), StandardCharsets.UTF_8);
+        String contentDisposition = "attachment; filename=\"" + encodedCasId + "\"";
 
-        ClientResponse response = webResource.path(encodedCasId)
-                .accept(MediaType.TEXT_XML)
-                // TODO: How to fix this? Shouldn't accept do it?
-                .header("Content-Type", MediaType.TEXT_XML)
-                .put(ClientResponse.class, xmiBytes);
+        Response response = webResource.path(encodedCasId)
+                .request(MediaType.TEXT_XML)
+                .header("Content-Type", MediaType.APPLICATION_OCTET_STREAM_TYPE)
+                .header("Content-Disposition", contentDisposition)
+                .header("Content-Length", xmiBytes.length)
+                .put(Entity.entity(xmiBytes, MediaType.APPLICATION_OCTET_STREAM_TYPE));
         
         if (response.getStatus() != 204) {
           throw new CoreException(new Status(Status.ERROR, CorpusServerPlugin.PLUGIN_ID,
diff --git a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/SearchCorpusServerJob.java b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/SearchCorpusServerJob.java
index 8dda9aa..2ce736d 100644
--- a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/SearchCorpusServerJob.java
+++ b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/SearchCorpusServerJob.java
@@ -17,7 +17,12 @@
 
 package org.apache.opennlp.corpus_server.caseditor;
 
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.codehaus.jettison.json.JSONArray;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -25,9 +30,7 @@ import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import org.glassfish.jersey.client.ClientProperties;
 
 /**
  * A job to retrieve search results from the corpus server.
@@ -53,30 +56,25 @@ public class SearchCorpusServerJob extends Job {
   @Override
   protected IStatus run(IProgressMonitor monitor) {
     
-    Client c = Client.create();
-    c.setConnectTimeout(10000);
-    WebResource r = c.resource(serverAddress);
-    
-    ClientResponse response;
-    
+    Client c = ClientBuilder.newClient();
+    c.property(ClientProperties.READ_TIMEOUT, 10000);
+    WebTarget r = c.target(serverAddress);
+
     try {
-      response = r
-          .path("_search")
+      Response response = r.path("_search")
           .queryParam("q", searchQuery)
-          .accept(MediaType.APPLICATION_JSON)
-          .get(ClientResponse.class);
+          .request(MediaType.APPLICATION_JSON)
+          .get();
+      if (response.getStatusInfo().getStatusCode() != 200) {
+        return new Status(IStatus.WARNING, CorpusServerPlugin.PLUGIN_ID, "Failed to retrieve results from server!");
+      }
+
+      searchResult = response.readEntity(JSONArray.class);
+      return new Status(IStatus.OK, CorpusServerPlugin.PLUGIN_ID, "OK");
     }
-    catch (com.sun.jersey.api.client.ClientHandlerException e) {
+    catch (ProcessingException e) {
       return new Status(IStatus.WARNING, CorpusServerPlugin.PLUGIN_ID, "Failed to connect to server!");
     }
-    
-    if (response.getStatusInfo().getStatusCode() != 200) {
-      return new Status(IStatus.WARNING, CorpusServerPlugin.PLUGIN_ID, "Failed to retrieve results from server!");
-    }
-    
-    searchResult = response.getEntity(JSONArray.class);
-    
-    return new Status(IStatus.OK, CorpusServerPlugin.PLUGIN_ID, "OK");
   }
   
   JSONArray getSearchResult() {
diff --git a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/TaskQueueView.java b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/TaskQueueView.java
index 7c65546..2cf4e67 100644
--- a/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/TaskQueueView.java
+++ b/caseditor-corpus-server-plugin/src/main/java/org/apache/opennlp/corpus_server/caseditor/TaskQueueView.java
@@ -20,7 +20,11 @@ package org.apache.opennlp.corpus_server.caseditor;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.viewers.ILabelProviderListener;
@@ -43,10 +47,6 @@ import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.ViewPart;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-
 /**
  * A task queue view to retrieve the next annotation task subject from the corpus server.
  */
@@ -89,17 +89,16 @@ public class TaskQueueView extends ViewPart {
       @Override
       public void widgetSelected(SelectionEvent event) {
 
-        Client c = Client.create();
-        
-        WebResource queueWebResource = c.resource(serverUrl.getText());
-        
-        ClientResponse response2 = queueWebResource
+        Client c = ClientBuilder.newClient();
+        WebTarget queueWebResource = c.target(serverUrl.getText());
+
+        Response response2 = queueWebResource
             .path("_nextTask")
-            .accept(MediaType.APPLICATION_JSON)
+            .request(MediaType.APPLICATION_JSON)
             .header("Content-Type", MediaType.TEXT_XML)
-            .get(ClientResponse.class);
-        
-        String casId = response2.getEntity(String.class);
+            .get();
+
+        String casId = response2.readEntity(String.class);
         
         // How to get the corpus uri for the item returned from the queue ???
         // Queue could always return full URI ...
diff --git a/corpus-server/corpus-server-connector/pom.xml b/corpus-server/corpus-server-connector/pom.xml
index e427162..e4e7c81 100644
--- a/corpus-server/corpus-server-connector/pom.xml
+++ b/corpus-server/corpus-server-connector/pom.xml
@@ -34,27 +34,29 @@
 
 	<dependencies>
 		<dependency>
-			<groupId>org.apache.opennlp</groupId>
-			<artifactId>corpus-server-core</artifactId>
-			<version>2.1.1-SNAPSHOT</version>
-			<scope>provided</scope>
+			<groupId>org.glassfish.jersey.core</groupId>
+			<artifactId>jersey-client</artifactId>
 		</dependency>
-		
+
 		<dependency>
-			<groupId>org.apache.opennlp</groupId>
-			<artifactId>corpus-server-impl</artifactId>
-			<version>2.1.1-SNAPSHOT</version>
-			<scope>test</scope>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jackson</artifactId>
 		</dependency>
 
 		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-json</artifactId>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jettison</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.codehaus.jettison</groupId>
+					<artifactId>jettison</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
 		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-client</artifactId>
+			<groupId>org.codehaus.jettison</groupId>
+			<artifactId>jettison</artifactId>
 		</dependency>
 
     	<dependency>
@@ -64,6 +66,21 @@
 			<scope>compile</scope>
 		</dependency>
 
+		<!-- TEST scoped -->
+		<dependency>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-core</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-impl</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>test</scope>
+		</dependency>
+		
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
 			<artifactId>junit-jupiter-api</artifactId>
diff --git a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
index c7a93f3..a41d837 100644
--- a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
@@ -19,7 +19,13 @@ package org.apache.opennlp.corpus_server.connector;
 
 import java.io.ByteArrayOutputStream;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.apache.uima.UimaContext;
 import org.apache.uima.analysis_component.CasAnnotator_ImplBase;
@@ -36,11 +42,6 @@ import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
 import org.xml.sax.SAXException;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.WebResource.Builder;
-
 /**
  * The CSCasWriter writes a CAS into a Corpus Server.
  */
@@ -57,8 +58,7 @@ public class CSCasWriter extends CasAnnotator_ImplBase {
   private Logger logger;
 
   @Override
-  public void initialize(UimaContext context)
-      throws ResourceInitializationException {
+  public void initialize(UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
 
     serverAddress = (String) context.getConfigParameterValue(CSQueueCollectionReader.SERVER_ADDRESS);
@@ -68,8 +68,7 @@ public class CSCasWriter extends CasAnnotator_ImplBase {
   }
 
   @Override
-  public void typeSystemInit(TypeSystem ts)
-      throws AnalysisEngineProcessException {
+  public void typeSystemInit(TypeSystem ts) throws AnalysisEngineProcessException {
     super.typeSystemInit(ts);
 
     String idTypeName = (String) getContext().getConfigParameterValue("IdFSTypeName");
@@ -92,47 +91,55 @@ public class CSCasWriter extends CasAnnotator_ImplBase {
       // Was inserted in the reader ...
       cas.removeFsFromIndexes(idFs);
       
-      ByteArrayOutputStream xmiBytes = new ByteArrayOutputStream();
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
       try {
-        XmiCasSerializer.serialize(cas, xmiBytes);
+        XmiCasSerializer.serialize(cas, baos);
       } catch (SAXException e) {
         throw new AnalysisEngineProcessException();
       }
+
+      byte[] xmiBytes = baos.toByteArray();
+
+      Client c = ClientBuilder.newClient();
+      WebTarget r = c.target(serverAddress + "/corpora/" + corpusName);
+
+      Invocation.Builder casResponseBuilder = r.path(casId)
+              .request(MediaType.TEXT_XML)
+              .header("Content-Type", MediaType.TEXT_XML)
+              .header("Content-Length", xmiBytes.length);
       
-      Client client = Client.create();
-      
-      WebResource corpusWebResource = client.resource(serverAddress + "/corpora/"
-          + corpusName);
-      
-      Builder casResponseBuilder = corpusWebResource.path(casId)
-          .accept(MediaType.TEXT_XML).header("Content-Type", MediaType.TEXT_XML);
-      
-      ClientResponse response;
       if ("add".equals(action)) {
-        response = casResponseBuilder.post(ClientResponse.class, xmiBytes);
+        try (Response res = casResponseBuilder
+                .post(Entity.entity(xmiBytes, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
+          logResponse(res, casId);
+        }
       }
       else if ("update".equals(action)) {
-        response = casResponseBuilder.put(ClientResponse.class, xmiBytes);
-      }
-      else {
-        throw new AnalysisEngineProcessException(new Exception("Unknown action: " + action));
-      }
-      
-      int statusCode = response.getStatus();
-      
-      if (statusCode > 400) {
-        if (logger.isLoggable(Level.SEVERE)) {
-          logger.log(Level.SEVERE, "Error (" + statusCode + "), " + action + ", " + casId);
+        try (Response res = casResponseBuilder
+                .put(Entity.entity(xmiBytes, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
+          logResponse(res, casId);
         }
       }
       else {
-        if (logger.isLoggable(Level.FINE)) {
-          logger.log(Level.FINE, "OK (" + statusCode + "),  " + action + ", " + casId);
-        }
+        throw new AnalysisEngineProcessException(new Exception("Unknown action: " + action));
       }
     }
     else {
       throw new AnalysisEngineProcessException(new Exception("Missing Id Feature Structure!"));
     }
   }
+
+  private void logResponse(Response res, String casId) {
+    int statusCode = res.getStatus();
+    if (statusCode > 400) {
+      if (logger.isLoggable(Level.SEVERE)) {
+        logger.log(Level.SEVERE, "Error (" + statusCode + "), " + action + ", " + casId);
+      }
+    }
+    else {
+      if (logger.isLoggable(Level.FINE)) {
+        logger.log(Level.FINE, "OK (" + statusCode + "),  " + action + ", " + casId);
+      }
+    }
+  }
 }
diff --git a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
index ab6ef0c..e27e158 100644
--- a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
@@ -23,7 +23,12 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.Feature;
@@ -36,10 +41,7 @@ import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.util.Level;
 import org.apache.uima.util.Logger;
 import org.apache.uima.util.Progress;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import org.glassfish.jersey.client.ClientResponse;
 
 /**
  * a {@link org.apache.uima.collection.CollectionReader} which reads {@link CAS}s from a corpus
@@ -79,62 +81,57 @@ public class CSQueueCollectionReader extends CollectionReader_ImplBase {
     corpusName = (String) getConfigParameterValue(CORPUS_NAME);
     
     String queueName = (String) getConfigParameterValue(QUEUE_NAME);
-    
     String searchQuery = (String) getConfigParameterValue(SEARCH_QUERY);
     
-    Client client = Client.create();
-    
+    Client c = ClientBuilder.newClient();
+
     // Create a queue if the search query is specified
     if (searchQuery != null) {
-      WebResource r = client.resource(serverAddress + "/queues/");
+      WebTarget r = c.target(serverAddress + "/queues/");
 
-      ClientResponse response = r.path("_createTaskQueue")
+      try (Response response = r.path("_createTaskQueue")
           .queryParam("corpusId", corpusName)
           .queryParam("queueId", queueName)
           .queryParam("q", searchQuery)
-          .accept(MediaType.TEXT_XML)
-          // TODO: How to fix this? Shouldn't accept do it?
-          .header("Content-Type", MediaType.TEXT_XML)
-          .post(ClientResponse.class);
-      
-      if (response.getStatus() != 204) {
-    	  throw new ResourceInitializationException(
-    			  new Exception("Failed to create queue: " + response.getStatus()));
-      }
-      
-      if (logger.isLoggable(Level.INFO)) {
-        logger.log(Level.INFO, "Successfully created queue: " + queueName + " for corpus: " + corpusName);
+          .request(MediaType.TEXT_XML)
+          // as this is an query-param driven POST request,
+          // we just set an empty string to the body.
+          .post(Entity.entity("", MediaType.TEXT_PLAIN_TYPE))) {
+
+        if (response.getStatus() != 204) {
+          throw new ResourceInitializationException(
+                  new Exception("Failed to create queue: " + response.getStatus()));
+        }
+
+        if (logger.isLoggable(Level.INFO)) {
+          logger.log(Level.INFO, "Successfully created queue: " + queueName + " for corpus: " + corpusName);
+        }
       }
     }
     
     // Retrieve queue link ...
     
     List<String> casIdList = new ArrayList<>();
-    
-    
-    WebResource r = client.resource(serverAddress +  "/queues/" + queueName);
-    
+    WebTarget r = c.target(serverAddress + "/queues/" + queueName);
+
     while (true) {
       System.out.println("Requesting next CAS ID!");
     	
       // TODO: Make query configurable ...
-      ClientResponse response = r
-              .path("_nextTask")
-              .accept(MediaType.APPLICATION_JSON)
+      try (Response response = r.path("_nextTask")
+              .request(MediaType.APPLICATION_JSON)
               .header("Content-Type", MediaType.TEXT_XML)
-              .get(ClientResponse.class);
-      
-      if (response.getStatus() == ClientResponse.Status.NO_CONTENT.getStatusCode()) {
-        System.out.println("##### FINISHED #####");
-        break;
+              .get()) {
+
+        if (response.getStatus() == Response.Status.OK.getStatusCode()) {
+            String casId = response.readEntity(String.class);
+            System.out.println("Received CAS ID: " + casId);
+            casIdList.add(casId);
+        } else if (response.getStatus() == Response.Status.NO_CONTENT.getStatusCode()) {
+          System.out.println("##### FINISHED #####");
+          break;
+        }
       }
-      else {
-      // TODO: Check if response was ok ...
-      }
-      String casId = response.getEntity(String.class);
-      casIdList.add(casId);
-      
-      System.out.println("Received CAS ID: " + casId);
     }
     
     casIds = casIdList.iterator();
@@ -155,29 +152,22 @@ public class CSQueueCollectionReader extends CollectionReader_ImplBase {
   public void getNext(CAS cas) throws IOException, CollectionException {
 	  
     String casId = casIds.next();
-	
-    
-    Client client = Client.create();
-    
-    WebResource corpusWebResource = client.resource(serverAddress + "/corpora/" + corpusName);
-    
-    ClientResponse casResponse = corpusWebResource
-        .path(casId)
-        .accept(MediaType.TEXT_XML)
+
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(serverAddress + "/corpora/" + corpusName);
+
+    ClientResponse casResponse = r.path(casId)
+        .request(MediaType.TEXT_XML)
         .header("Content-Type", MediaType.TEXT_XML)
         .get(ClientResponse.class);
-    
 
-    try (InputStream casIn = casResponse.getEntityInputStream()) {
+    try (InputStream casIn = casResponse.getEntityStream()) {
       UimaUtil.deserializeXmiCAS(cas, casIn);
-    }
-    catch (IOException e) {
-      if (logger.isLoggable(Level.SEVERE)) {
-        logger.log(Level.SEVERE, "Failed to load CAS: " +  casId + " code: " + casResponse.getStatus());
-      }
+    } catch (IOException e) {
+      logger.log(Level.SEVERE,"Failed to load CAS: " +  casId + " code: " + casResponse.getStatus());
       throw e;
     }
-    
+
     if (idType != null && idFeature != null) {
       FeatureStructure idFS = cas.createFS(idType);
       idFS.setStringValue(idFeature, casId);
@@ -189,7 +179,6 @@ public class CSQueueCollectionReader extends CollectionReader_ImplBase {
   public boolean hasNext() throws IOException, CollectionException {
     
     // TODO: What to do if content for cas cannot be loaded? Skip CAS? Report error?
-    
     return casIds.hasNext();
   }
 
diff --git a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
index b606fd9..6ce2f43 100644
--- a/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
@@ -67,8 +67,7 @@ public class UimaUtil {
   }
 
   public static CAS createEmptyCAS(TypeSystemDescription typeSystem) {
-    ResourceSpecifierFactory resourceSpecifierFactory = UIMAFramework
-        .getResourceSpecifierFactory();
+    ResourceSpecifierFactory resourceSpecifierFactory = UIMAFramework.getResourceSpecifierFactory();
     TypePriorities typePriorities = resourceSpecifierFactory
         .createTypePriorities();
 
@@ -105,8 +104,7 @@ public class UimaUtil {
       throw new IllegalStateException("SAX error while creating parser!", e);
     }
 
-    XmiCasDeserializer dezerializer = new XmiCasDeserializer(
-        cas.getTypeSystem());
+    XmiCasDeserializer dezerializer = new XmiCasDeserializer(cas.getTypeSystem());
 
     try {
       saxParser.parse(xmiIn, dezerializer.getXmiCasHandler(cas));
diff --git a/corpus-server/corpus-server-core/feature.xml b/corpus-server/corpus-server-core/feature.xml
index a7804ab..8df9ba6 100644
--- a/corpus-server/corpus-server-core/feature.xml
+++ b/corpus-server/corpus-server-core/feature.xml
@@ -22,17 +22,18 @@
 <features>
 	<!-- This feature.xml should be automatically be generated, all dependencies are duplicated here! -->
     <feature name="opennlp-corpus-server" version="2.1.1.SNAPSHOT">
-        <bundle>http://repo1.maven.org/maven2/org/ops4j/pax/web/pax-web-jetty-bundle/0.7.1/pax-web-jetty-bundle-0.7.1.jar</bundle>
-        <bundle>http://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-extender-war/0.7.1/pax-web-extender-war-0.7.1.jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-core&amp;v=1.12&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-server&amp;v=1.12&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-servlet&amp;v=1.12&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-json&amp;v=1.12&amp;e=jar</bundle>
-        <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-core-asl/1.9.2/jackson-core-asl-1.9.2.jar</bundle>
-        <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-jaxrs/1.9.2/jackson-jaxrs-1.9.2.jar</bundle>
-        <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-xc/1.9.2/jackson-xc-1.9.2.jar</bundle>
-        <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-mapper-asl/1.9.2/jackson-mapper-asl-1.9.2.jar</bundle>
-        <bundle>http://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.3.1/jettison-1.3.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/ops4j/pax/web/pax-web-jetty-bundle/0.7.1/pax-web-jetty-bundle-0.7.1.jar</bundle>
+        <bundle>https://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-extender-war/0.7.1/pax-web-extender-war-0.7.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-common/2.39.1/jersey-common-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server/2.39.1/jersey-server-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet/2.39.1/jersey-container-servlet-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet-core/2.39.1/jersey-container-servlet-core-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-client/2.39.1/jersey-client-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-core-asl/1.9.2/jackson-core-asl-1.9.2.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-jaxrs/1.9.2/jackson-jaxrs-1.9.2.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-xc/1.9.2/jackson-xc-1.9.2.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-mapper-asl/1.9.2/jackson-mapper-asl-1.9.2.jar</bundle>
         <bundle>mvn:org.apache.opennlp/corpus-server/2.1.1-SNAPSHOT</bundle>
     </feature>
 </features>
\ No newline at end of file
diff --git a/corpus-server/corpus-server-core/pom.xml b/corpus-server/corpus-server-core/pom.xml
index 732ef60..6880c4e 100644
--- a/corpus-server/corpus-server-core/pom.xml
+++ b/corpus-server/corpus-server-core/pom.xml
@@ -49,22 +49,41 @@
     </dependency>
 
     <dependency>
-      <groupId>com.sun.jersey</groupId>
-      <artifactId>jersey-servlet</artifactId>
+      <groupId>org.glassfish.jersey.containers</groupId>
+      <artifactId>jersey-container-servlet</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.glassfish.jersey.media</groupId>
+      <artifactId>jersey-media-json-jackson</artifactId>
+      <scope>provided</scope>
     </dependency>
 
     <dependency>
-      <groupId>com.sun.jersey</groupId>
-      <artifactId>jersey-json</artifactId>
+      <groupId>org.glassfish.jersey.media</groupId>
+      <artifactId>jersey-media-json-jettison</artifactId>
       <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.codehaus.jettison</groupId>
+          <artifactId>jettison</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
 
     <dependency>
-      <groupId>com.sun.jersey</groupId>
+      <groupId>org.glassfish.jersey.core</groupId>
       <artifactId>jersey-client</artifactId>
       <scope>provided</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.codehaus.jettison</groupId>
+      <artifactId>jettison</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
diff --git a/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
index 8db7261..bb9e8a0 100644
--- a/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
@@ -32,7 +32,7 @@ import org.osgi.service.http.HttpService;
 import org.osgi.service.http.NamespaceException;
 import org.osgi.util.tracker.ServiceTracker;
 
-import com.sun.jersey.spi.container.servlet.ServletContainer;
+import org.glassfish.jersey.servlet.ServletContainer;
 
 public class CorpusServerBundle implements BundleActivator {
 
diff --git a/corpus-server/corpus-server-impl/pom.xml b/corpus-server/corpus-server-impl/pom.xml
index 5ce9072..53f85e4 100644
--- a/corpus-server/corpus-server-impl/pom.xml
+++ b/corpus-server/corpus-server-impl/pom.xml
@@ -44,15 +44,11 @@
 		<dependency>
 				<groupId>org.osgi</groupId>
 				<artifactId>org.osgi.core</artifactId>
-				<version>4.2.0</version>
-				<scope>provided</scope>
 		</dependency>
 
 		<dependency>
 				<groupId>org.osgi</groupId>
 				<artifactId>org.osgi.compendium</artifactId>
-				<version>4.2.0</version>
-				<scope>provided</scope>
 		</dependency>
 
 		<dependency>
@@ -119,7 +115,7 @@
 							<instructions>
 								<Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>
 								<Embed-Transitive>true</Embed-Transitive>
-									<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+									<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
 									<Import-Package>
 										!com.sun.jdmk.comm,
 										!javax.persistence.*,
diff --git a/corpus-server/corpus-server-tools/pom.xml b/corpus-server/corpus-server-tools/pom.xml
index 1b96650..f44bc8c 100644
--- a/corpus-server/corpus-server-tools/pom.xml
+++ b/corpus-server/corpus-server-tools/pom.xml
@@ -34,24 +34,34 @@
 	<name>Apache OpenNLP Corpus Server Shell</name>
 
 	<dependencies>
+
 		<dependency>
-			<groupId>org.apache.opennlp</groupId>
-			<artifactId>corpus-server-core</artifactId>
-			<version>2.1.1-SNAPSHOT</version>
-			<scope>provided</scope>
+			<groupId>org.glassfish.jersey.core</groupId>
+			<artifactId>jersey-client</artifactId>
 		</dependency>
 
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jackson</artifactId>
 		</dependency>
 
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jettison</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.codehaus.jettison</groupId>
+					<artifactId>jettison</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>org.codehaus.jettison</groupId>
+			<artifactId>jettison</artifactId>
 		</dependency>
     
-    	<dependency>
+		<dependency>
 			<groupId>org.apache.uima</groupId>
 			<artifactId>uimaj-core</artifactId>
 			<version>${uimaj.version}</version>
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
index 68fc6c1..b74bd9b 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
@@ -18,13 +18,13 @@
 package org.apache.opennlp.corpus_server.tools;
 
 import java.io.File;
-import java.io.FilenameFilter;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import javax.ws.rs.core.Response;
 
 public class CASImporter {
 
@@ -35,9 +35,8 @@ public class CASImporter {
       System.exit(-1);
     }
 
-    Client c = Client.create();
-
-    WebResource r = c.resource(args[0]);
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
 
     File xmiFileOrFolder = new File(args[1]);
 
@@ -46,24 +45,20 @@ public class CASImporter {
     if (xmiFileOrFolder.isFile()) {
       xmiFiles = new File[] { xmiFileOrFolder };
     } else {
-      xmiFiles = xmiFileOrFolder.listFiles(new FilenameFilter() {
-        @Override
-        public boolean accept(File dir, String name) {
-          return name.toLowerCase().endsWith(".xmi");
-        }
-      });
+      xmiFiles = xmiFileOrFolder.listFiles((dir, name) -> name.toLowerCase().endsWith(".xmi"));
     }
 
     for (File xmiFile : xmiFiles) {
       byte[] xmiBytes = FileUtil.fileToBytes(xmiFile);
 
-      ClientResponse response = r.path(xmiFile.getName())
-          .accept(MediaType.TEXT_XML)
-          // TODO: How to fix this? Shouldn't accept do it?
-          .header("Content-Type", MediaType.TEXT_XML)
-          .post(ClientResponse.class, xmiBytes);
+      try (Response response = r.path(xmiFile.getName())
+              .request(MediaType.TEXT_XML)
+              .header("Content-Type", MediaType.TEXT_XML)
+              .header("Content-Length", xmiBytes.length)
+              .put(Entity.entity(xmiBytes, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
 
-      System.out.println(xmiFile.getName() + " " + response.getStatus());
+        System.out.println(xmiFile.getName() + " " + response.getStatus());
+      }
     }
   }
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
index 66b7a65..3a9c31c 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
@@ -25,11 +25,14 @@ import java.io.OutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import org.glassfish.jersey.client.ClientResponse;
 
 /** 
  * Tools to back up a corpus from the corpus server into a zip package.
@@ -39,8 +42,7 @@ import com.sun.jersey.api.client.WebResource;
  */
 public class CorpusBackup {
 
-  private static void copyStream(InputStream in,
-      OutputStream out) throws IOException {
+  private static void copyStream(InputStream in, OutputStream out) throws IOException {
     
     byte[] buffer = new byte[1024];
     int len;
@@ -59,21 +61,24 @@ public class CorpusBackup {
       System.exit(-1);
     }
 
-    Client c = Client.create();
-
-    WebResource r = c.resource(args[0] + "/queues");
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0] + "/queues");
 
     String corpusId = args[1];
     String backupQueueId = args[1] + "BackupQueue";
     
-    ClientResponse createQueueResponse = r.path("_createTaskQueue")
+    try (Response createQueueResponse = r.path("_createTaskQueue")
         .queryParam("corpusId", args[1])
         .queryParam("queueId", backupQueueId)
         .queryParam("q", "*:*")
-        .accept(MediaType.TEXT_XML)
-        // TODO: How to fix this? Shouldn't accept do it?
+        .request(MediaType.TEXT_XML)
         .header("Content-Type", MediaType.TEXT_XML)
-        .post(ClientResponse.class);
+        // as this is an query-param driven POST request,
+        // we just set an empty string to the body.
+        .post(Entity.entity("", MediaType.TEXT_PLAIN_TYPE))) {
+      
+      System.out.println("Result (_createTaskQueue): " + createQueueResponse.getStatus());
+    }
     
     // zip file name ...
     File backupFile = new File(args[2]);
@@ -82,58 +87,53 @@ public class CorpusBackup {
 
     try (OutputStream backupOut = new FileOutputStream(backupFile);
          ZipOutputStream zipPackageOut = new ZipOutputStream(backupOut)){
-    
-      WebResource corpusWebResource = c.resource(args[0] + "/corpora/" + corpusId);
-      
-      // fetch ts, does it work like this!?
-      ClientResponse tsResponse = corpusWebResource
-          .path("_typesystem")
-          .accept(MediaType.TEXT_XML)
-          // TODO: How to fix this? Shouldn't accept do it?
+
+      WebTarget corpusWebResource = c.target(args[0] + "/corpora/" + corpusId);
+
+      // fetch ts
+      ClientResponse tsResponse = corpusWebResource.path("_typesystem")
+          .request(MediaType.TEXT_XML)
           .header("Content-Type", MediaType.TEXT_XML)
           .get(ClientResponse.class);
-      
+
       zipPackageOut.putNextEntry(new ZipEntry("TypeSystem.xml"));
-      try (InputStream tsIn = tsResponse.getEntityInputStream()) {
+      try (InputStream tsIn = tsResponse.getEntityStream()) {
         copyStream(tsIn, zipPackageOut);
       }
       zipPackageOut.closeEntry();
-      
+
       // consume task queue
-      WebResource r2 = c.resource(args[0] + "/queues/" + backupQueueId);
-      
+      WebTarget r2 = c.target(args[0] + "/queues/" + backupQueueId);
+
       while (true) {
         // TODO: Make query configurable ...
-        ClientResponse response2 = r2
-                .path("_nextTask")
+        ClientResponse response2 = r2.path("_nextTask")
                 .queryParam("q", args[1])
-                .accept(MediaType.APPLICATION_JSON)
+                .request(MediaType.APPLICATION_JSON)
                 .header("Content-Type", MediaType.TEXT_XML)
                 .get(ClientResponse.class);
-        
-        if (response2.getStatus() == ClientResponse.Status.NO_CONTENT.getStatusCode()) {
+
+        if (response2.getStatus() == Response.Status.NO_CONTENT.getStatusCode()) {
           System.out.println("##### FINISHED #####");
           break;
         }
-        
+
         // check if response was ok ...
-        
-        String casId = response2.getEntity(String.class);
-        
-        ClientResponse casResponse = corpusWebResource
-            .path(casId)
-            .accept(MediaType.TEXT_XML)
+        String casId = response2.readEntity(String.class);
+
+        ClientResponse casResponse = corpusWebResource.path(casId)
+            .request(MediaType.TEXT_XML)
             .header("Content-Type", MediaType.TEXT_XML)
             .get(ClientResponse.class);
-        
+
         zipPackageOut.putNextEntry(new ZipEntry(casId));
 
-        try (InputStream casIn = casResponse.getEntityInputStream()) {
+        try (InputStream casIn = casResponse.getEntityStream()) {
           copyStream(casIn, zipPackageOut);
         }
-        
+
         zipPackageOut.closeEntry();
-        
+
         System.out.println(casId);
       }
     }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
index ebcea1d..c2e0795 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
@@ -17,29 +17,29 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.util.XMLInputSource;
 import org.apache.uima.util.XMLParser;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
-
 /**
  * Command Line Tool to create a new corpus in the corpus server.
  */
 public class CreateCorpus {
+
   public static void main(String[] args) throws Exception {
 
     if (args.length != 4) {
@@ -50,44 +50,37 @@ public class CreateCorpus {
 
     String corpusName = args[1];
 
-    ClientConfig clientConfig = new DefaultClientConfig();
-    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
-        Boolean.TRUE);
-
-    Client c = Client.create(clientConfig);
-
-    WebResource r = c.resource(args[0]);
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
 
     byte[][] resources = new byte[2][];
 
     // Load and resolve type system before importing it
-    InputStream typeSystemIn = new FileInputStream(new File(args[2]));
+    try (InputStream typeSystemIn = new BufferedInputStream(new FileInputStream(args[2]))) {
 
-    XMLInputSource xmlTypeSystemSource = new XMLInputSource(typeSystemIn,
-        new File(args[2]));
+      XMLParser xmlParser = UIMAFramework.getXMLParser();
+      XMLInputSource xmlTypeSystemSource = new XMLInputSource(typeSystemIn,new File(args[2]));
 
-    XMLParser xmlParser = UIMAFramework.getXMLParser();
+      TypeSystemDescription typeSystemDescriptor =
+              (TypeSystemDescription) xmlParser.parse(xmlTypeSystemSource);
+      typeSystemDescriptor.resolveImports();
 
-    TypeSystemDescription typeSystemDescriptor = (TypeSystemDescription) xmlParser
-        .parse(xmlTypeSystemSource);
+      ByteArrayOutputStream typeSystemBytes = new ByteArrayOutputStream();
+      typeSystemDescriptor.toXML(typeSystemBytes);
 
-    typeSystemDescriptor.resolveImports();
+      resources[0] = typeSystemBytes.toByteArray();
 
-    ByteArrayOutputStream typeSystemBytes = new ByteArrayOutputStream();
-    typeSystemDescriptor.toXML(typeSystemBytes);
+      byte[] indexMappingBytes = FileUtil.fileToBytes(new File(args[3]));
+      resources[1] = indexMappingBytes;
 
-    resources[0] = typeSystemBytes.toByteArray();
+      try (Response response = r.path("_createCorpus")
+              .queryParam("corpusName", corpusName)
+              .request(MediaType.APPLICATION_JSON)
+              .header("Content-Type", MediaType.APPLICATION_JSON_TYPE)
+              .post(Entity.entity(resources, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
 
-    byte[] indexMappingBytes = FileUtil.fileToBytes(new File(args[3]));
-    resources[1] = indexMappingBytes;
-
-    ClientResponse response = r.path("_createCorpus")
-        .queryParam("corpusName", corpusName)
-        .accept(MediaType.APPLICATION_JSON)
-        // TODO: How to fix this? Shouldn't accept do it?
-        .header("Content-Type", MediaType.APPLICATION_JSON_TYPE)
-        .post(ClientResponse.class, resources);
-
-    System.out.println("Result: " + response.getStatus());
+        System.out.println("Result: " + response.getStatus());
+      }
+    }
   }
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
index d459868..d91c5f5 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
@@ -17,11 +17,12 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import javax.ws.rs.core.Response;
 
 public class CreateTaskQueue {
   
@@ -33,19 +34,21 @@ public class CreateTaskQueue {
 
     String corpusName = args[1];
 
-    Client c = Client.create();
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
 
-    WebResource r = c.resource(args[0]);
+    try (Response response = r.path("_createTaskQueue")
+            .queryParam("corpusId", corpusName)
+            .queryParam("queueId", args[2])
+            .queryParam("q", args[3])
+            .request(MediaType.TEXT_XML)
+            .header("Content-Type", MediaType.TEXT_XML)
+            // as this is an query-param driven POST request,
+            // we just set an empty string to the body.
+            .post(Entity.entity("", MediaType.TEXT_PLAIN_TYPE))) {
 
-    ClientResponse response = r.path("_createTaskQueue")
-        .queryParam("corpusId", corpusName)
-        .queryParam("queueId", args[2])
-        .queryParam("q", args[3])
-        .accept(MediaType.TEXT_XML)
-        // TODO: How to fix this? Shouldn't accept do it?
-        .header("Content-Type", MediaType.TEXT_XML)
-        .post(ClientResponse.class);
+      System.out.println("Result: " + response.getStatus());
+    }
 
-    System.out.println("Result: " + response.getStatus());
   }
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
index a5b44b6..c4c8335 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
@@ -17,19 +17,18 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
+import javax.ws.rs.core.Response;
 
 /**
  * Command Line Tool to drop a corpus in the corpus server.
  */
 public class DropCorpus {
+
   public static void main(String[] args) throws Exception {
 
     if (args.length != 2) {
@@ -39,21 +38,19 @@ public class DropCorpus {
 
     String corpusName = args[1];
 
-    ClientConfig clientConfig = new DefaultClientConfig();
-    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
-        Boolean.TRUE);
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
 
-    Client c = Client.create(clientConfig);
+    try (Response response = r.path("_dropCorpus")
+            .queryParam("corpusName", corpusName)
+            .request(MediaType.APPLICATION_JSON)
+            .header("Content-Type", MediaType.APPLICATION_JSON_TYPE)
+            // as this is an query-param driven POST request,
+            // we just set an empty string to the body.
+            .post(Entity.entity("", MediaType.APPLICATION_JSON))) {
 
-    WebResource r = c.resource(args[0]);
-
-    ClientResponse response = r.path("_dropCorpus")
-        .queryParam("corpusName", corpusName)
-        .accept(MediaType.APPLICATION_JSON)
-        // TODO: How to fix this? Shouldn't accept do it?
-        .header("Content-Type", MediaType.APPLICATION_JSON_TYPE)
-        .post(ClientResponse.class);
+      System.out.println("Result: " + response.getStatus());
+    }
 
-    System.out.println("Result: " + response.getStatus());
   }
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
index 8f8a4f4..e768f4d 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
@@ -17,6 +17,7 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -28,7 +29,7 @@ public class FileUtil {
   static byte[] fileToBytes(File file) throws IOException {
 
     try (ByteArrayOutputStream fileBytes = new ByteArrayOutputStream((int) file.length());
-         InputStream fileIn = new FileInputStream(file)) {
+         InputStream fileIn = new BufferedInputStream(new FileInputStream(file))) {
       byte[] buffer = new byte[1024];
       int length;
       while ((length = fileIn.read(buffer)) > 0) {
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
index e1ebc41..e2ec205 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
@@ -17,9 +17,10 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
 
 /**
  * Command Line Tool to remove a CAS from a corpus.
@@ -32,16 +33,15 @@ public class RemoveCAS {
       System.out.println("RemoveCAS corpusAddress casId");
       System.exit(-1);
     }
-    
-    Client c = Client.create();
 
-    WebResource r = c.resource(args[0]);
-    
-    ClientResponse response = r
-        .path(args[1])
-        .delete(ClientResponse.class);
-    
-    System.out.println("Result: " + response.getStatus());
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
+
+    try (Response response = r.path(args[1])
+        .request()
+        .delete()) {
+
+      System.out.println("Result: " + response.getStatus());
+    }
   }
-  
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
index a590225..988076d 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
@@ -17,22 +17,24 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.util.XMLInputSource;
 import org.apache.uima.util.XMLParser;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-
 public class ReplaceTypeSystem {
 
   public static void main(String[] args) throws Exception {
@@ -42,32 +44,31 @@ public class ReplaceTypeSystem {
       System.exit(-1);
     }
     
-    Client c = Client.create();
+    Client c = ClientBuilder.newClient();
+    WebTarget r = c.target(args[0]);
 
-    WebResource r = c.resource(args[0]);
-    
- // Load and resolve type system before importing it
-    InputStream typeSystemIn = new FileInputStream(new File(args[1]));
+    // Load and resolve type system before importing it
+    try (InputStream typeSystemIn = new BufferedInputStream(new FileInputStream(args[1]))) {
+      XMLParser xmlParser = UIMAFramework.getXMLParser();
+      XMLInputSource xmlTypeSystemSource = new XMLInputSource(typeSystemIn, new File(args[1]));
 
-    XMLInputSource xmlTypeSystemSource = new XMLInputSource(typeSystemIn,
-        new File(args[1]));
+      TypeSystemDescription typeSystemDesciptor = (TypeSystemDescription) xmlParser
+              .parse(xmlTypeSystemSource);
+      typeSystemDesciptor.resolveImports();
 
-    XMLParser xmlParser = UIMAFramework.getXMLParser();
+      ByteArrayOutputStream typeSystemBytes = new ByteArrayOutputStream();
+      typeSystemDesciptor.toXML(typeSystemBytes);
 
-    TypeSystemDescription typeSystemDesciptor = (TypeSystemDescription) xmlParser
-        .parse(xmlTypeSystemSource);
+      byte[] bytes = typeSystemBytes.toByteArray();
+      try (Response response = r.path("_replaceTypeSystem")
+              .request(MediaType.TEXT_XML)
+              .header("Content-Type", MediaType.TEXT_XML)
+              .header("Content-Length", bytes.length)
+              .put(Entity.entity(bytes, MediaType.APPLICATION_OCTET_STREAM_TYPE))) {
 
-    typeSystemDesciptor.resolveImports();
+        System.out.println("Response: " + response.getStatus());
+      }
 
-    ByteArrayOutputStream typeSystemBytes = new ByteArrayOutputStream();
-    typeSystemDesciptor.toXML(typeSystemBytes);
-    
-    ClientResponse response = r.path("_replaceTypeSystem")
-        .accept(MediaType.TEXT_XML)
-        // TODO: How to fix this? Shouldn't accept do it?
-        .header("Content-Type", MediaType.TEXT_XML)
-        .put(ClientResponse.class, typeSystemBytes.toByteArray());
-    
-    System.out.println("Response: " + response.getStatus());
+    }
   }
 }
diff --git a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
index 3c70c14..0a549ea 100644
--- a/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
+++ b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
@@ -17,14 +17,14 @@
 
 package org.apache.opennlp.corpus_server.tools;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 import org.codehaus.jettison.json.JSONArray;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-
 public class SearchCorpus {
 
 	public static void main(String[] args) throws Exception {
@@ -33,24 +33,24 @@ public class SearchCorpus {
 			System.out.println("SearchCorpus address query");
 			System.exit(-1);
 		}
+
+		Client c = ClientBuilder.newClient();
+		WebTarget r = c.target(args[0]);
 		
-		Client c = Client.create();
-		
-		WebResource r = c.resource(args[0]);
-		
-		ClientResponse response = r
-				.path("_search")
-				.queryParam("q", args[1])
-				.accept(MediaType.APPLICATION_JSON)
-				.header("Content-Type", MediaType.TEXT_XML)
-				.get(ClientResponse.class);
-		
-		JSONArray searchResult = response.getEntity(JSONArray.class);
-		
-		System.out.println("Status: " + response.getStatus());
-		
-		for (int i = 0; i < searchResult.length(); i++) {
-			System.out.println("Hit: " + searchResult.getString(i));
+		try (Response response = r.path("_search")
+						.queryParam("q", args[1])
+						.request(MediaType.APPLICATION_JSON)
+						.header("Content-Type", MediaType.TEXT_XML)
+						.get()) {
+
+			JSONArray searchResult = response.readEntity(JSONArray.class);
+
+			System.out.println("Status: " + response.getStatus());
+
+			for (int i = 0; i < searchResult.length(); i++) {
+				System.out.println("Hit: " + searchResult.getString(i));
+			}
 		}
+
 	}
 }
diff --git a/corpus-server/pom.xml b/corpus-server/pom.xml
index a06826a..3626bfd 100644
--- a/corpus-server/pom.xml
+++ b/corpus-server/pom.xml
@@ -47,45 +47,62 @@
   <dependencyManagement>
     <dependencies>
       <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <version>2.5</version>
-            <scope>provided</scope>
-        </dependency>
+        <groupId>javax.servlet</groupId>
+        <artifactId>servlet-api</artifactId>
+        <version>2.5</version>
+        <scope>provided</scope>
+      </dependency>
 
       <dependency>
-          <groupId>org.osgi</groupId>
-          <artifactId>org.osgi.core</artifactId>
-          <version>4.2.0</version>
-          <scope>provided</scope>
+        <groupId>org.glassfish.jersey.containers</groupId>
+        <artifactId>jersey-container-servlet</artifactId>
+        <version>${jersey-server.version}</version>
       </dependency>
 
       <dependency>
-          <groupId>org.osgi</groupId>
-          <artifactId>org.osgi.compendium</artifactId>
-          <version>4.2.0</version>
-          <scope>provided</scope>
+        <groupId>org.glassfish.jersey.core</groupId>
+        <artifactId>jersey-client</artifactId>
+        <version>${jersey-client.version}</version>
       </dependency>
 
       <dependency>
-        <groupId>com.sun.jersey</groupId>
-        <artifactId>jersey-servlet</artifactId>
-        <version>1.19.4</version>
-        <scope>provided</scope>
+        <groupId>org.glassfish.jersey.media</groupId>
+        <artifactId>jersey-media-json-jackson</artifactId>
+        <version>${jersey-server.version}</version>
+        <scope>runtime</scope>
+      </dependency>
+      
+      <dependency>
+        <groupId>org.glassfish.jersey.media</groupId>
+        <artifactId>jersey-media-json-jettison</artifactId>
+        <version>${jersey-server.version}</version>
+        <scope>runtime</scope>
+        <exclusions>
+          <exclusion>
+            <groupId>org.codehaus.jettison</groupId>
+            <artifactId>jettison</artifactId>
+          </exclusion>
+        </exclusions>
       </dependency>
 
       <dependency>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-json</artifactId>
-          <version>1.19.4</version>
-          <scope>provided</scope>
+        <groupId>org.codehaus.jettison</groupId>
+        <artifactId>jettison</artifactId>
+        <version>${jettison.version}</version>
       </dependency>
 
       <dependency>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-client</artifactId>
-          <version>1.19.4</version>
-          <scope>provided</scope>
+        <groupId>org.osgi</groupId>
+        <artifactId>org.osgi.core</artifactId>
+        <version>4.2.0</version>
+        <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>org.osgi</groupId>
+        <artifactId>org.osgi.compendium</artifactId>
+        <version>4.2.0</version>
+        <scope>provided</scope>
       </dependency>
 
     </dependencies>
@@ -105,25 +122,5 @@
         </plugin>
       </plugins>
     </pluginManagement>
-		<plugins>
-
-      <!-- plugin>
-				<groupId>org.apache.karaf.tooling</groupId>
-				<artifactId>features-maven-plugin</artifactId>
-				<version>2.2.4</version>
-				<executions>
-					<execution>
-						<id>generate-features-file</id>
-						<goals>
-							<goal>generate-features-file</goal>
-						</goals>
-						<configuration>
-							<karafVersion>2.2.4</karafVersion>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin -->
-      
-		</plugins>
 	</build>
 </project>
\ No newline at end of file
diff --git a/mahout-addon/pom.xml b/mahout-addon/pom.xml
index fbce241..490b202 100644
--- a/mahout-addon/pom.xml
+++ b/mahout-addon/pom.xml
@@ -42,6 +42,56 @@
 			<groupId>org.apache.mahout</groupId>
 			<artifactId>mahout-core</artifactId>
 			<version>0.9</version>
+			<exclusions>
+				<!-- No need for CLI tooling here -->
+				<exclusion>
+					<groupId>org.apache.mahout.commons</groupId>
+					<artifactId>commons-cli</artifactId>
+				</exclusion>
+				<!-- exluding as mahout-core brings ancient version (CVEs) -->
+				<exclusion>
+					<groupId>com.google</groupId>
+					<artifactId>guava</artifactId>
+				</exclusion>
+				<!-- exluding as mahout-core brings ancient version (CVEs) -->
+				<exclusion>
+					<groupId>com.thoughtworks.xstream</groupId>
+					<artifactId>xstream</artifactId>
+				</exclusion>
+				<!-- This is not needed any way and brings in ancient jersey -->
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>jersey-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>jersey-server</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>jersey-json</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>31.1-jre</version>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>com.thoughtworks.xstream</groupId>
+			<artifactId>xstream</artifactId>
+			<version>1.4.20</version>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-beanutils</groupId>
+			<artifactId>commons-beanutils</artifactId>
+			<scope>runtime</scope>
 		</dependency>
 
 		<dependency>
diff --git a/pom.xml b/pom.xml
index d85500d..98f3906 100644
--- a/pom.xml
+++ b/pom.xml
@@ -121,7 +121,10 @@
         <opennlp.forkCount>1.0C</opennlp.forkCount>
 
         <uimaj.version>3.3.1</uimaj.version>
-
+        <jersey-client.version>2.39.1</jersey-client.version>
+        <jersey-server.version>2.39.1</jersey-server.version>
+        <jettison.version>1.5.4</jettison.version>
+        
         <junit.version>5.9.2</junit.version>
 
         <enforcer.plugin.version>3.0.0-M3</enforcer.plugin.version>
@@ -156,7 +159,7 @@
             <dependency>
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-lang3</artifactId>
-                <version>3.4</version>
+                <version>3.12.0</version>
             </dependency>
             <dependency>
                 <groupId>commons-codec</groupId>
@@ -168,17 +171,20 @@
                 <artifactId>commons-logging</artifactId>
                 <version>1.1.1</version>
             </dependency>
-
             <dependency>
                 <groupId>commons-collections</groupId>
                 <artifactId>commons-collections</artifactId>
                 <version>3.2.2</version>
             </dependency>
-
             <dependency>
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-math3</artifactId>
-                <version>3.5</version>
+                <version>3.6.1</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-beanutils</groupId>
+                <artifactId>commons-beanutils</artifactId>
+                <version>1.9.4</version>
             </dependency>
 
             <dependency>
@@ -500,6 +506,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>${checkstyle.plugin.version}</version>
             </plugin>
         </plugins>
     </build>
diff --git a/tagging-server/feature.xml b/tagging-server/feature.xml
index 3f2799a..aa7ae67 100644
--- a/tagging-server/feature.xml
+++ b/tagging-server/feature.xml
@@ -24,15 +24,16 @@
         <bundle>https://repo1.maven.org/maven2/org/apache/opennlp/opennlp-tools/2.1.1/opennlp-tools-2.1.1.jar</bundle>
         <bundle>https://repo1.maven.org/maven2/org/ops4j/pax/web/pax-web-jetty-bundle/0.7.1/pax-web-jetty-bundle-0.7.1.jar</bundle>
         <bundle>https://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-extender-war/0.7.1/pax-web-extender-war-0.7.1.jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-core&amp;v=1.19.4&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-server&amp;v=1.19.4&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-servlet&amp;v=1.19.4&amp;e=jar</bundle>
-        <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-json&amp;v=1.19.4&amp;e=jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-common/2.39.1/jersey-common-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server/2.39.1/jersey-server-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet/2.39.1/jersey-container-servlet-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet-core/2.39.1/jersey-container-servlet-core-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-client/2.39.1/jersey-client-2.39.1.jar</bundle>
+        <bundle>https://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar</bundle>
         <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-core-asl/1.9.2/jackson-core-asl-1.9.2.jar</bundle>
         <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-jaxrs/1.9.2/jackson-jaxrs-1.9.2.jar</bundle>
         <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-xc/1.9.2/jackson-xc-1.9.2.jar</bundle>
         <bundle>https://repo1.maven.org/maven2/org/codehaus/jackson/jackson-mapper-asl/1.9.2/jackson-mapper-asl-1.9.2.jar</bundle>
-        <bundle>https://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.3.1/jettison-1.3.1.jar</bundle>
         <bundle>mvn:org.apache.opennlp/tagging-server/2.1.1-SNAPSHOT</bundle>
     </feature>
 </features>
\ No newline at end of file
diff --git a/tagging-server/pom.xml b/tagging-server/pom.xml
index fed494d..ed0ad29 100644
--- a/tagging-server/pom.xml
+++ b/tagging-server/pom.xml
@@ -38,7 +38,40 @@
 		  <groupId>org.apache.opennlp</groupId>
 		  <artifactId>opennlp-tools</artifactId>
 		</dependency>
-		
+
+		<dependency>
+			<groupId>org.glassfish.jersey.containers</groupId>
+			<artifactId>jersey-container-servlet</artifactId>
+			<version>${jersey-server.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jackson</artifactId>
+			<version>${jersey-server.version}</version>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.glassfish.jersey.media</groupId>
+			<artifactId>jersey-media-json-jettison</artifactId>
+			<version>${jersey-server.version}</version>
+			<scope>runtime</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.codehaus.jettison</groupId>
+					<artifactId>jettison</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>org.codehaus.jettison</groupId>
+			<artifactId>jettison</artifactId>
+			<version>${jettison.version}</version>
+			<scope>runtime</scope>
+		</dependency>
+
 		<dependency>
 				<groupId>javax.servlet</groupId>
 				<artifactId>servlet-api</artifactId>
@@ -57,23 +90,12 @@
 				<version>4.2.0</version>
 		</dependency>
 
+		<!-- TEST scoped -->
 		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-servlet</artifactId>
-			<version>1.19.4</version>
-		</dependency>
-		
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
-		    <version>1.19.4</version>
-		</dependency>
-
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
-		    <version>1.19.4</version>
-		    <scope>test</scope>
+			<groupId>org.glassfish.jersey.core</groupId>
+			<artifactId>jersey-client</artifactId>
+			<version>${jersey-client.version}</version>
+			<scope>test</scope>
 		</dependency>
 
 		<dependency>
@@ -145,12 +167,13 @@
 										!sun.misc,
 										javax.servlet,
 										*,
-										com.sun.jersey.json.impl.provider.entity.*,
-										com.sun.jersey.json.*,
+										org.glassfish.jersey.json.impl.provider.entity.*,
+										org.glassfish.jersey.json.*,
 										org.codehaus.jackson.*,
 										org.codehaus.jackson.xc,
-										com.sun.jersey.api.core,
-										com.sun.jersey.spi.container.servlet
+										org.glassfish.jersey.spi,
+										org.glassfish.jersey.server.spi
+										org.glassfish.jersey.servlet.spi
 									</Import-Package>
 									<!-- Import-Package>!com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
 									<Export-Package>org.apache.opennlp.tagging_server.*</Export-Package>
diff --git a/tagging-server/src/main/java/org/apache/opennlp/tagging_server/TaggingServerBundle.java b/tagging-server/src/main/java/org/apache/opennlp/tagging_server/TaggingServerBundle.java
index 2fa0007..33542d8 100644
--- a/tagging-server/src/main/java/org/apache/opennlp/tagging_server/TaggingServerBundle.java
+++ b/tagging-server/src/main/java/org/apache/opennlp/tagging_server/TaggingServerBundle.java
@@ -29,7 +29,7 @@ import org.osgi.service.http.HttpService;
 import org.osgi.service.http.NamespaceException;
 import org.osgi.util.tracker.ServiceTracker;
 
-import com.sun.jersey.spi.container.servlet.ServletContainer;
+import org.glassfish.jersey.servlet.ServletContainer;
 
 public class TaggingServerBundle implements BundleActivator {
 
@@ -69,7 +69,6 @@ public class TaggingServerBundle implements BundleActivator {
         if (httpService == service) {
 
           httpService.unregister("/rest");
-
           httpService = null;
         }
         
diff --git a/wikinews-importer/pom.xml b/wikinews-importer/pom.xml
index be59205..3d6f6c1 100644
--- a/wikinews-importer/pom.xml
+++ b/wikinews-importer/pom.xml
@@ -33,22 +33,7 @@
 
 	<name>Apache OpenNLP Wikinews Importer</name>
 
-	<properties>
-		<uimaj.version>3.3.1</uimaj.version>
-	</properties>
-
 	<dependencies>
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
-		    <version>1.19.4</version>
-		</dependency>
-
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
-		    <version>1.19.4</version>
-		</dependency>
 
 	    <dependency> 
 	      <groupId>info.bliki.wiki</groupId>