You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2022/08/29 15:51:54 UTC

[uima-ruta] branch main updated: Issue #100 - Enable type system discovery via SPI in OSGI

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

rec pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/uima-ruta.git


The following commit(s) were added to refs/heads/main by this push:
     new ac8f2631 Issue #100 - Enable type system discovery via SPI in OSGI
ac8f2631 is described below

commit ac8f2631a6287286db39bb385e89cf52a9b4591b
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Mon Aug 29 17:51:45 2022 +0200

    Issue #100 - Enable type system discovery via SPI in OSGI
    
    - Added Apache SNAPSHOT repo
    - UIMA Parent POM 15 -> 16-SNAPSHOT
    - UIMA Java SDK 3.3.0 -> 3.4.0-SNAPSHOT
    - uimaFIT 3.3.0 -> 3.4.0-SNAPSHOT
    - spring 5.3.20 -> 5.3.21
    - Added SPI to ruta-base-type module
    - Added SPI to ruta-typesystem module
    - Turned ruta-core module into an OSGI bundle
    - Turned ruta-base-type and ruta-typesystem into fragments attaching to ruta-core
    - Added RAT excludes for SPI service files
    - Script to install code style configuration
---
 installEclipseSettings.sh                          |  49 ++
 ruta-basic-type/.gitignore                         |   1 +
 .../marker-file-identifying-osgi-bundle            |   0
 ruta-basic-type/pom.xml                            |  55 ++-
 .../uima/ruta/type/RutaBasicTypeProvider.java      |  34 ++
 .../services/org.apache.uima.spi.JCasClassProvider |   1 +
 ruta-core/.gitignore                               |   1 +
 ruta-core/marker-file-identifying-osgi-bundle      |   0
 ruta-core/pom.xml                                  |  32 +-
 ruta-parent/pom.xml                                | 547 +++++++++++----------
 ruta-typesystem/.gitignore                         |   1 +
 .../marker-file-identifying-osgi-bundle            |   0
 ruta-typesystem/pom.xml                            |  58 ++-
 .../spi/RutaTypeSystemDescriptionProvider.java     | 104 ++++
 .../services/org.apache.uima.spi.JCasClassProvider |   1 +
 ...g.apache.uima.spi.TypeSystemDescriptionProvider |   1 +
 16 files changed, 613 insertions(+), 272 deletions(-)

diff --git a/installEclipseSettings.sh b/installEclipseSettings.sh
new file mode 100755
index 00000000..68ffe32b
--- /dev/null
+++ b/installEclipseSettings.sh
@@ -0,0 +1,49 @@
+#/bin/sh
+# 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.
+
+# Formatter settings
+JDT_CORE_PREFS="/Users/rec/uima-code-style-settings/org.eclipse.jdt.core.prefs"
+
+# Save actions
+JDT_UI_PREFS="/Users/rec/uima-code-style-settings/org.eclipse.jdt.ui.prefs"
+
+function installPrefs {
+  mkdir -p $1/.settings/
+  cp -v $JDT_CORE_PREFS $1/.settings/
+  cp -v $JDT_UI_PREFS $1/.settings/
+}
+
+installPrefs example-projects
+installPrefs ruta-basic-type
+installPrefs ruta-core
+installPrefs ruta-core-ext
+installPrefs ruta-docbook
+installPrefs ruta-eclipse-feature
+installPrefs ruta-eclipse-update-site
+installPrefs ruta-ep-addons
+installPrefs ruta-ep-caseditor
+installPrefs ruta-ep-core-ext
+installPrefs ruta-ep-engine
+installPrefs ruta-ep-ide
+installPrefs ruta-ep-ide-ui
+installPrefs ruta-ep-parent
+installPrefs ruta-ep-textruler
+installPrefs ruta-maven-archetype
+installPrefs ruta-maven-plugin
+installPrefs ruta-parent
+installPrefs ruta-typesystem
diff --git a/ruta-basic-type/.gitignore b/ruta-basic-type/.gitignore
new file mode 100644
index 00000000..3385916d
--- /dev/null
+++ b/ruta-basic-type/.gitignore
@@ -0,0 +1 @@
+/META-INF/
diff --git a/ruta-basic-type/marker-file-identifying-osgi-bundle b/ruta-basic-type/marker-file-identifying-osgi-bundle
new file mode 100644
index 00000000..e69de29b
diff --git a/ruta-basic-type/pom.xml b/ruta-basic-type/pom.xml
index 22c340a2..15a3a4c6 100644
--- a/ruta-basic-type/pom.xml
+++ b/ruta-basic-type/pom.xml
@@ -17,9 +17,11 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <artifactId>ruta-basic-type</artifactId>
+
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>ruta-parent</artifactId>
@@ -27,14 +29,17 @@
     <relativePath>../ruta-parent/pom.xml</relativePath>
   </parent>
 
+  <artifactId>ruta-basic-type</artifactId>
+  <packaging>bundle</packaging>
+
+  <name>Apache UIMA Ruta: ${project.artifactId}</name>
+  <description>The RutaBasic type provided by ruta-core.</description>
+  <url>${uimaWebsiteUrl}</url>
+
   <properties>
     <uimaScmProject>${project.artifactId}</uimaScmProject>
   </properties>
 
-  <url>${uimaWebsiteUrl}</url>
-  <description>The RutaBasic type provided by ruta-core.</description>
-  <name>Apache UIMA Ruta: ${project.artifactId}</name>
-
   <scm>
     <connection>scm:git:https://github.com/apache/uima-ruta/</connection>
     <developerConnection>scm:git:https://github.com/apache/uima-ruta/</developerConnection>
@@ -82,6 +87,44 @@
         </plugin>
       </plugins>
     </pluginManagement>
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Fragment-Host>org.apache.uima.ruta-core</Fragment-Host>
+            <Export-Package>
+              org.apache.uima.ruta.type
+            </Export-Package>
+            <Require-Capability>
+              osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"
+            </Require-Capability>
+            <Provide-Capability>
+              osgi.serviceloader;osgi.serviceloader=org.apache.uima.spi.JCasClassProvider
+            </Provide-Capability>
+          </instructions>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-cli</id>
+            <configuration>
+              <excludes combine.children="append">
+                <exclude>src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider</exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
     <resources>
       <resource>
         <directory>src/main/resources</directory>
diff --git a/ruta-basic-type/src/main/java/org/apache/uima/ruta/type/RutaBasicTypeProvider.java b/ruta-basic-type/src/main/java/org/apache/uima/ruta/type/RutaBasicTypeProvider.java
new file mode 100644
index 00000000..61fb5ff6
--- /dev/null
+++ b/ruta-basic-type/src/main/java/org/apache/uima/ruta/type/RutaBasicTypeProvider.java
@@ -0,0 +1,34 @@
+/*
+ * 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.uima.ruta.type;
+
+import static java.util.Arrays.asList;
+
+import java.util.List;
+
+import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.spi.JCasClassProvider;
+
+public class RutaBasicTypeProvider implements JCasClassProvider {
+
+  @Override
+  public List<Class<? extends TOP>> listJCasClasses() {
+    return asList(RutaBasic.class);
+  }
+}
diff --git a/ruta-basic-type/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider b/ruta-basic-type/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider
new file mode 100644
index 00000000..ec3d6cec
--- /dev/null
+++ b/ruta-basic-type/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider
@@ -0,0 +1 @@
+org.apache.uima.ruta.type.RutaBasicTypeProvider
diff --git a/ruta-core/.gitignore b/ruta-core/.gitignore
index 862d2767..33b796c7 100644
--- a/ruta-core/.gitignore
+++ b/ruta-core/.gitignore
@@ -1,2 +1,3 @@
 input/
 TypeSystem.xml
+/META-INF/
diff --git a/ruta-core/marker-file-identifying-osgi-bundle b/ruta-core/marker-file-identifying-osgi-bundle
new file mode 100644
index 00000000..e69de29b
diff --git a/ruta-core/pom.xml b/ruta-core/pom.xml
index 5709978a..2671b0a0 100644
--- a/ruta-core/pom.xml
+++ b/ruta-core/pom.xml
@@ -19,7 +19,6 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <artifactId>ruta-core</artifactId>
 
   <parent>
     <groupId>org.apache.uima</groupId>
@@ -28,6 +27,9 @@
     <relativePath>../ruta-parent/pom.xml</relativePath>
   </parent>
 
+  <artifactId>ruta-core</artifactId>
+  <packaging>bundle</packaging>
+
   <properties>
     <uimaScmProject>${project.artifactId}</uimaScmProject>
     <postNoticeText>${uniWueNoticeText}</postNoticeText>
@@ -45,7 +47,6 @@
   </scm>
 
   <dependencies>
-
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>ruta-typesystem</artifactId>
@@ -222,12 +223,39 @@
         </plugin>
       </plugins>
     </pluginManagement>
+
     <resources>
       <resource>
         <directory>src/main/resources</directory>
       </resource>
     </resources>
+
     <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Bundle-RequiredExecutionEnvironment>JavaSE-1.8</Bundle-RequiredExecutionEnvironment>
+            <_dsannotations>*</_dsannotations>
+            <_metatypeannotations>*</_metatypeannotations>
+            <!--  
+            <Import-Package>
+              !com.apple.eio,
+              org.slf4j.impl;resolution:=optional,
+              org.apache.logging.log4j.*;resolution:=optional,
+              org.apache.logging.slf4j.*;resolution:=optional,
+              *
+            </Import-Package>
+            -->
+            <Export-Package>
+              org.apache.uima.ruta,
+              org.apache.uima.ruta.*
+            </Export-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+    
       <!-- generate java code for antlr grammars -->
       <plugin>
         <groupId>org.antlr</groupId>
diff --git a/ruta-parent/pom.xml b/ruta-parent/pom.xml
index d3741716..058cdc44 100644
--- a/ruta-parent/pom.xml
+++ b/ruta-parent/pom.xml
@@ -17,35 +17,37 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.uima</groupId>
-    <artifactId>parent-pom</artifactId>
-    <version>15</version>
-    <relativePath />
-  </parent>
+	<parent>
+		<groupId>org.apache.uima</groupId>
+		<artifactId>parent-pom</artifactId>
+		<version>16-SNAPSHOT</version>
+		<relativePath />
+	</parent>
 
-  <artifactId>ruta-parent</artifactId>
-  <packaging>pom</packaging>
-  <version>3.3.0-SNAPSHOT</version>
-  <name>Apache UIMA Ruta: ${project.artifactId}</name>
-  <url>${uimaWebsiteUrl}</url>
-  <inceptionYear>2011</inceptionYear>
-  <description>The common parent pom for the UIMA Ruta</description>
+	<artifactId>ruta-parent</artifactId>
+	<packaging>pom</packaging>
+	<version>3.3.0-SNAPSHOT</version>
+	<name>Apache UIMA Ruta: ${project.artifactId}</name>
+	<url>${uimaWebsiteUrl}</url>
+	<inceptionYear>2011</inceptionYear>
+	<description>The common parent pom for the UIMA Ruta</description>
 
   <!-- Special inheritance note even though the <scm> element that follows 
     is exactly the same as those in super poms, it cannot be inherited because 
     there is some special code that computes the connection elements from the 
     chain of parent poms, if this is omitted. Keeping this a bit factored allows 
     cutting/pasting the <scm> element, and just changing the following two properties -->
-  <scm>
-    <connection>scm:git:https://github.com/apache/uima-ruta/</connection>
-    <developerConnection>scm:git:https://github.com/apache/uima-ruta/</developerConnection>
-    <url>https://github.com/apache/uima-ruta/</url>
-    <tag>HEAD</tag>
-  </scm>
+	<scm>
+		<connection>scm:git:https://github.com/apache/uima-ruta/</connection>
+		<developerConnection>scm:git:https://github.com/apache/uima-ruta/</developerConnection>
+		<url>https://github.com/apache/uima-ruta/</url>
+		<tag>HEAD</tag>
+	</scm>
 
   <!-- The repositories and pluginRepositories section is duplicated from 
     the parent pom one, and adds the Apache Snapshot Nexus repository where UIMA 
@@ -53,256 +55,281 @@
     on some new SNAPSHOT level of a build tool, where the users hasn't checked 
     out the build tooling. This allows maven to find the snapshots when looking 
     for the parent of this pom -->
-  <repositories>
+	<repositories>
     <!-- modify central repository access: Turn on checksum checking -->
-    <repository>
-      <id>central</id>
-      <name>Maven Repository Switchboard</name>
-      <layout>default</layout>
-      <url>https://repo1.maven.org/maven2</url>
+		<repository>
+			<id>central</id>
+			<name>Maven Repository Switchboard</name>
+			<layout>default</layout>
+			<url>https://repo1.maven.org/maven2</url>
 
-      <releases>
-        <enabled>true</enabled>
-        <checksumPolicy>fail</checksumPolicy>
-        <updatePolicy>never</updatePolicy>
-      </releases>
+			<releases>
+				<enabled>true</enabled>
+				<checksumPolicy>fail</checksumPolicy>
+				<updatePolicy>never</updatePolicy>
+			</releases>
 
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-  </repositories>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+		</repository>
 
-  <properties>
-    <uniWueNoticeText>Portions of UIMA Ruta were originally developed by
-      the Universität Würzburg.
-      Copyright (c) 2006, 2011 Universität
-      Würzburg.</uniWueNoticeText>
-    <postNoticeText>${uniWueNoticeText}
+		<repository>
+			<id>apache.snapshots</id>
+			<url>https://repository.apache.org/content/repositories/snapshots</url>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+		</repository>
+	</repositories>
 
-      This product contains icons
-      developed by Mark James
-      (http://www.famfamfam.com/lab/icons/silk/), licensed under the
-      Creative Commons Attribution 3.0 License.
-    </postNoticeText>
+	<!-- Only for testing -->
+	<pluginRepositories>
+		<pluginRepository>
+			<id>apache.snapshots</id>
+			<url>https://repository.apache.org/content/repositories/snapshots/</url>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+		</pluginRepository>
+	</pluginRepositories>
 
-    <uimaVersion>3.3.0</uimaVersion>
-    <uimafit-version>3.3.0</uimafit-version>
-    <spring-version>5.3.20</spring-version>
-    <junit-version>4.13.2</junit-version>
-    <slf4j-version>1.7.36</slf4j-version>
+	<properties>
+		<uniWueNoticeText>Portions of UIMA Ruta were originally developed by
+			the Universität Würzburg.
+			Copyright (c) 2006, 2011 Universität
+			Würzburg.</uniWueNoticeText>
+		<postNoticeText>${uniWueNoticeText}
 
-    <antlr-version>3.5.3</antlr-version>
-    <htmlparser-version>1.6</htmlparser-version>
-    <commons-collections-version>3.2.2</commons-collections-version>
-    <commons-collections4-version>4.4</commons-collections4-version>
-    <commons-text-version>1.9</commons-text-version>
-    <commons-lang3-version>3.12.0</commons-lang3-version>
-    <commons-io-version>2.11.0</commons-io-version>
-    <commons-math3-version>3.6.1</commons-math3-version>
-    <commons-logging-version>1.1.1</commons-logging-version>
-    <commons-logging-api-version>1.1</commons-logging-api-version>
-    <caffeine-version>2.9.3</caffeine-version>
+			This product contains icons
+			developed by Mark James
+			(http://www.famfamfam.com/lab/icons/silk/), licensed under the
+			Creative Commons Attribution 3.0 License.
+		</postNoticeText>
 
-    <api_check_oldVersion>3.2.0</api_check_oldVersion>
+		<uimaVersion>3.4.0-SNAPSHOT</uimaVersion>
+		<uimafit-version>3.4.0-SNAPSHOT</uimafit-version>
+		<spring-version>5.3.21</spring-version>
+		<junit-version>4.13.2</junit-version>
+		<slf4j-version>1.7.36</slf4j-version>
 
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.target>1.8</maven.compiler.target>
-    <maven.compiler.source>1.8</maven.compiler.source>
-  </properties>
+		<antlr-version>3.5.3</antlr-version>
+		<htmlparser-version>1.6</htmlparser-version>
+		<commons-collections-version>3.2.2</commons-collections-version>
+		<commons-collections4-version>4.4</commons-collections4-version>
+		<commons-text-version>1.9</commons-text-version>
+		<commons-lang3-version>3.12.0</commons-lang3-version>
+		<commons-io-version>2.11.0</commons-io-version>
+		<commons-math3-version>3.6.1</commons-math3-version>
+		<commons-logging-version>1.1.1</commons-logging-version>
+		<commons-logging-api-version>1.1</commons-logging-api-version>
+		<caffeine-version>2.9.3</caffeine-version>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.antlr</groupId>
-        <artifactId>antlr-runtime</artifactId>
-        <version>${antlr-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.htmlparser</groupId>
-        <artifactId>htmlparser</artifactId>
-        <version>${htmlparser-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-collections</groupId>
-        <artifactId>commons-collections</artifactId>
-        <version>${commons-collections-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-collections4</artifactId>
-        <version>${commons-collections4-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-text</artifactId>
-        <version>${commons-text-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-lang3</artifactId>
-        <version>${commons-lang3-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>uimafit-core</artifactId>
-        <version>${uimafit-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>${commons-io-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-math3</artifactId>
-        <version>${commons-math3-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging</artifactId>
-        <version>${commons-logging-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging-api</artifactId>
-        <version>${commons-logging-api-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-core</artifactId>
-        <version>${spring-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-context</artifactId>
-        <version>${spring-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-expression</artifactId>
-        <version>${spring-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-beans</artifactId>
-        <version>${spring-version}</version>
-      </dependency>
+		<api_check_oldVersion>3.2.0</api_check_oldVersion>
 
-      <dependency>
-        <groupId>com.github.ben-manes.caffeine</groupId>
-        <artifactId>caffeine</artifactId>
-        <version>${caffeine-version}</version>
-      </dependency>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
+	</properties>
 
-      <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>${junit-version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-jdk14</artifactId>
-        <version>${slf4j-version}</version>
-        <scope>test</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.antlr</groupId>
+				<artifactId>antlr-runtime</artifactId>
+				<version>${antlr-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.htmlparser</groupId>
+				<artifactId>htmlparser</artifactId>
+				<version>${htmlparser-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-collections</groupId>
+				<artifactId>commons-collections</artifactId>
+				<version>${commons-collections-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-collections4</artifactId>
+				<version>${commons-collections4-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-text</artifactId>
+				<version>${commons-text-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-lang3</artifactId>
+				<version>${commons-lang3-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.uima</groupId>
+				<artifactId>uimafit-core</artifactId>
+				<version>${uimafit-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-io</groupId>
+				<artifactId>commons-io</artifactId>
+				<version>${commons-io-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-math3</artifactId>
+				<version>${commons-math3-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-logging</groupId>
+				<artifactId>commons-logging</artifactId>
+				<version>${commons-logging-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-logging</groupId>
+				<artifactId>commons-logging-api</artifactId>
+				<version>${commons-logging-api-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-core</artifactId>
+				<version>${spring-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-context</artifactId>
+				<version>${spring-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-expression</artifactId>
+				<version>${spring-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-beans</artifactId>
+				<version>${spring-version}</version>
+			</dependency>
 
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.uima</groupId>
-          <artifactId>uima-build-helper-maven-plugin</artifactId>
-          <version>7</version>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <configuration>
-            <source>${maven.compiler.source}</source>
-            <target>${maven.compiler.target}</target>
-          </configuration>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-javadoc-plugin</artifactId>
-          <executions>
-            <execution>
-              <id>attach-javadocs</id>
-              <configuration>
-                <source>${maven.compiler.source}</source>
-              </configuration>
-            </execution>
-          </executions>
-          <configuration>
-            <source>${maven.compiler.source}</source>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-toolchains-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>toolchain</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <toolchains>
-            <jdk>
-              <version>${maven.compiler.target}</version>
-            </jdk>
-          </toolchains>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy customized bin LICENSE file</id>
-            <phase>prepare-package</phase>
-            <goals>
-              <goal>copy-resources</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>${project.build.directory}/classes/META-INF</outputDirectory>
-              <resources>
-                <resource>
-                  <directory>src/main/readme_bin</directory>
-                  <includes>
-                    <include>LICENSE</include>
-                    <include>NOTICE</include>
-                  </includes>
-                  <filtering>true</filtering>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  
-  <profiles>
-    <profile>
-      <id>spotbugs</id>
-      <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <groupId>com.github.spotbugs</groupId>
-              <artifactId>spotbugs-maven-plugin</artifactId>
-              <version>4.7.0.0</version>
-            </plugin>
-          </plugins>
-        </pluginManagement>
-      </build>
-    </profile>
-  </profiles>
+			<dependency>
+				<groupId>com.github.ben-manes.caffeine</groupId>
+				<artifactId>caffeine</artifactId>
+				<version>${caffeine-version}</version>
+			</dependency>
+
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>${junit-version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-jdk14</artifactId>
+				<version>${slf4j-version}</version>
+				<scope>test</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.uima</groupId>
+					<artifactId>uima-build-helper-maven-plugin</artifactId>
+					<version>7</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<configuration>
+						<source>${maven.compiler.source}</source>
+						<target>${maven.compiler.target}</target>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<executions>
+						<execution>
+							<id>attach-javadocs</id>
+							<configuration>
+								<source>${maven.compiler.source}</source>
+							</configuration>
+						</execution>
+					</executions>
+					<configuration>
+						<source>${maven.compiler.source}</source>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-toolchains-plugin</artifactId>
+				<executions>
+					<execution>
+						<goals>
+							<goal>toolchain</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<toolchains>
+						<jdk>
+							<version>${maven.compiler.target}</version>
+						</jdk>
+					</toolchains>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-resources-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy customized bin LICENSE file</id>
+						<phase>prepare-package</phase>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>${project.build.directory}/classes/META-INF</outputDirectory>
+							<resources>
+								<resource>
+									<directory>src/main/readme_bin</directory>
+									<includes>
+										<include>LICENSE</include>
+										<include>NOTICE</include>
+									</includes>
+									<filtering>true</filtering>
+								</resource>
+							</resources>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+	<profiles>
+		<profile>
+			<id>spotbugs</id>
+			<build>
+				<pluginManagement>
+					<plugins>
+						<plugin>
+							<groupId>com.github.spotbugs</groupId>
+							<artifactId>spotbugs-maven-plugin</artifactId>
+							<version>4.7.0.0</version>
+						</plugin>
+					</plugins>
+				</pluginManagement>
+			</build>
+		</profile>
+	</profiles>
 </project>
diff --git a/ruta-typesystem/.gitignore b/ruta-typesystem/.gitignore
new file mode 100644
index 00000000..3385916d
--- /dev/null
+++ b/ruta-typesystem/.gitignore
@@ -0,0 +1 @@
+/META-INF/
diff --git a/ruta-typesystem/marker-file-identifying-osgi-bundle b/ruta-typesystem/marker-file-identifying-osgi-bundle
new file mode 100644
index 00000000..e69de29b
diff --git a/ruta-typesystem/pom.xml b/ruta-typesystem/pom.xml
index 96fe1754..12fe9d3e 100644
--- a/ruta-typesystem/pom.xml
+++ b/ruta-typesystem/pom.xml
@@ -17,9 +17,11 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <artifactId>ruta-typesystem</artifactId>
+
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>ruta-parent</artifactId>
@@ -27,9 +29,12 @@
     <relativePath>../ruta-parent/pom.xml</relativePath>
   </parent>
 
-  <url>${uimaWebsiteUrl}</url>
-  <description>The type systems provided by ruta-core.</description>
+  <artifactId>ruta-typesystem</artifactId>
+  <packaging>bundle</packaging>
+
   <name>Apache UIMA Ruta: ${project.artifactId}</name>
+  <description>The type systems provided by ruta-core.</description>
+  <url>${uimaWebsiteUrl}</url>
 
   <properties>
     <uimaScmProject>${project.artifactId}</uimaScmProject>
@@ -83,12 +88,39 @@
         </plugin>
       </plugins>
     </pluginManagement>
+
     <resources>
       <resource>
         <directory>src/main/resources</directory>
       </resource>
     </resources>
+
     <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Fragment-Host>org.apache.uima.ruta-core</Fragment-Host>
+            <Import-Package>
+              org.apache.uima.ruta.type;-split-package:=merge-first
+            </Import-Package>
+            <Export-Package>
+              org.apache.uima.ruta.type;-split-package:=merge-first,
+              org.apache.uima.ruta.type.html,
+              org.apache.uima.ruta.engine;-split-package:=merge-first
+            </Export-Package>
+            <Require-Capability>
+              osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"
+            </Require-Capability>
+            <Provide-Capability>
+              osgi.serviceloader;osgi.serviceloader=org.apache.uima.spi.TypeSystemDescriptionProvider,
+              osgi.serviceloader;osgi.serviceloader=org.apache.uima.spi.JCasClassProvider
+            </Provide-Capability>
+          </instructions>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.apache.uima</groupId>
         <artifactId>jcasgen-maven-plugin</artifactId>
@@ -112,6 +144,7 @@
           </execution>
         </executions>
       </plugin>
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
@@ -119,6 +152,7 @@
           <argLine>-Xmx650M</argLine>
         </configuration>
       </plugin>
+
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
@@ -129,6 +163,22 @@
           </sourceFileExcludes>
         </configuration>
       </plugin>
+
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-cli</id>
+            <configuration>
+              <excludes combine.children="append">
+                <exclude>src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider</exclude>
+                <exclude>src/main/resources/META-INF/services/org.apache.uima.spi.TypeSystemDescriptionProvider</exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 </project>
\ No newline at end of file
diff --git a/ruta-typesystem/src/main/java/org/apache/uima/ruta/type/spi/RutaTypeSystemDescriptionProvider.java b/ruta-typesystem/src/main/java/org/apache/uima/ruta/type/spi/RutaTypeSystemDescriptionProvider.java
new file mode 100644
index 00000000..1edb9ef7
--- /dev/null
+++ b/ruta-typesystem/src/main/java/org/apache/uima/ruta/type/spi/RutaTypeSystemDescriptionProvider.java
@@ -0,0 +1,104 @@
+/*
+ * 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.uima.ruta.type.spi;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.resource.ResourceManager;
+import org.apache.uima.resource.impl.ResourceManager_impl;
+import org.apache.uima.resource.metadata.TypeDescription;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.spi.JCasClassProvider;
+import org.apache.uima.spi.TypeSystemDescriptionProvider;
+import org.apache.uima.util.InvalidXMLException;
+import org.apache.uima.util.XMLInputSource;
+
+public class RutaTypeSystemDescriptionProvider
+        implements TypeSystemDescriptionProvider, JCasClassProvider {
+
+  @Override
+  public List<TypeSystemDescription> listTypeSystemDescriptions() {
+
+    return loadTypeSystemDescriptionsFromClasspath(getClass(), //
+            "/org/apache/uima/ruta/engine/BasicTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/DefaultSeederTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/HtmlTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/PlainTextTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/RutaBasicTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml", //
+            "/org/apache/uima/ruta/engine/SourceDocumentInformation.xml");
+  }
+
+  @Override
+  public List<Class<? extends TOP>> listJCasClasses() {
+
+    List<Class<? extends TOP>> classes = new ArrayList<>();
+    ClassLoader cl = getClass().getClassLoader();
+
+    List<TypeSystemDescription> typeSystemDescriptions = listTypeSystemDescriptions();
+    for (TypeSystemDescription tsd : typeSystemDescriptions) {
+      for (TypeDescription td : tsd.getTypes()) {
+        try {
+          classes.add((Class<? extends TOP>) cl.loadClass(td.getName()));
+        } catch (ClassNotFoundException e) {
+          // This is acceptable - there may not be a JCas class
+        }
+      }
+    }
+
+    return classes;
+  }
+
+  public static List<TypeSystemDescription> loadTypeSystemDescriptionsFromClasspath(
+          Class<?> aContext, String... typeSystemDescriptionFiles) {
+
+    ResourceManager resMgr = new ResourceManager_impl(aContext.getClassLoader());
+    try {
+      List<TypeSystemDescription> typeSystemDescriptions = new ArrayList<>();
+
+      for (String typeSystem : typeSystemDescriptionFiles) {
+        URL resource = aContext.getResource(typeSystem);
+        if (resource == null) {
+          UIMAFramework.getLogger()
+                  .error("Unable to locate type system description as a resource [{}]", typeSystem);
+          continue;
+        }
+
+        try {
+          TypeSystemDescription tsd = UIMAFramework.getXMLParser()
+                  .parseTypeSystemDescription(new XMLInputSource(resource));
+          tsd.resolveImports(resMgr);
+          typeSystemDescriptions.add(tsd);
+        } catch (InvalidXMLException | IOException e) {
+          UIMAFramework.getLogger().error("Error loading type system description [{}] from [{}]",
+                  typeSystem, resource, e);
+        }
+      }
+
+      return typeSystemDescriptions;
+    } finally {
+      resMgr.destroy();
+    }
+  }
+}
diff --git a/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider b/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider
new file mode 100644
index 00000000..fff89516
--- /dev/null
+++ b/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.JCasClassProvider
@@ -0,0 +1 @@
+org.apache.uima.ruta.type.spi.RutaTypeSystemDescriptionProvider
\ No newline at end of file
diff --git a/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.TypeSystemDescriptionProvider b/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.TypeSystemDescriptionProvider
new file mode 100644
index 00000000..9bfd15ab
--- /dev/null
+++ b/ruta-typesystem/src/main/resources/META-INF/services/org.apache.uima.spi.TypeSystemDescriptionProvider
@@ -0,0 +1 @@
+org.apache.uima.ruta.type.spi.RutaTypeSystemDescriptionProvider