initial import
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..49ca981
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.idea
+*.iml
+target
+
diff --git a/README.adoc b/README.adoc
new file mode 100644
index 0000000..8d4a2f1
--- /dev/null
+++ b/README.adoc
@@ -0,0 +1,10 @@
+= Geronimo Microprofile Health Implementation
+
+[source,xml]
+----
+<parent>
+ <groupId>org.apache.geronimo</groupId>
+ <artifactId>geronimo-health</artifactId>
+ <version>${project.version}</version>
+</parent>
+----
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..dd41ce4
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<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</groupId>
+ <artifactId>apache</artifactId>
+ <version>20</version>
+ </parent>
+
+ <groupId>org.apache.geronimo</groupId>
+ <artifactId>geronimo-health</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>Geronimo Microprofile Health Implementation</name>
+
+ <description>
+ Apache Geronimo implementation of the Microprofile Health Specification
+ </description>
+
+ <scm>
+ <connection>scm:git:https://gitbox.apache.org/repos/asf/geronimo-health.git</connection>
+ <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/geronimo-health.git</developerConnection>
+ <url>https://gitbox.apache.org/repos/asf/geronimo-health.git</url>
+ <tag>HEAD</tag>
+ </scm>
+
+ <properties>
+ <spec.version>1.0</spec.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.microprofile.health</groupId>
+ <artifactId>microprofile-health-api</artifactId>
+ <version>${spec.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>tomcat-servlet-api</artifactId>
+ <version>9.0.7</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
+ <version>1.0-alpha-1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-json_1.1_spec</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jsonb_1.0_spec</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-interceptor_1.2_spec</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-atinject_1.0_spec</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jcdi_2.0_spec</artifactId>
+ <version>1.0.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-annotation_1.3_spec</artifactId>
+ <version>1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.microprofile.config</groupId>
+ <artifactId>microprofile-config-api</artifactId>
+ <version>1.2</version>
+ <scope>provided</scope>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency> <!-- issue with the cache key -->
+ <groupId>org.apache.openwebbeans</groupId>
+ <artifactId>openwebbeans-impl</artifactId>
+ <version>2.0.5</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jacc_1.1_spec</artifactId>
+ <version>1.0.2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.arquillian.testng</groupId>
+ <artifactId>arquillian-testng-container</artifactId>
+ <version>1.1.13.Final</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.testng</groupId>
+ <artifactId>testng</artifactId>
+ <version>6.8.21</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.meecrowave</groupId>
+ <artifactId>meecrowave-arquillian</artifactId>
+ <version>1.2.1</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.microprofile.health</groupId>
+ <artifactId>microprofile-health-tck</artifactId>
+ <version>${spec.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.7.0</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.22.0</version>
+ <configuration>
+ <dependenciesToScan>
+ <dependency>org.eclipse.microprofile.health:microprofile-health-tck</dependency>
+ </dependenciesToScan>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.0.2</version>
+ <configuration>
+ <archive combine.children="append">
+ <manifestEntries>
+ <Automatic-Module-Name>org.apache.geronimo.microprofile.health</Automatic-Module-Name>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <organization>
+ <name>The Apache Software Foundation</name>
+ <url>http://www.apache.org/</url>
+ </organization>
+
+ <inceptionYear>2018</inceptionYear>
+
+ <licenses>
+ <license>
+ <name>Apache License, Version 2.0</name>
+ <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+
+ <developers>
+ <developer>
+ <name>Apache Geronimo Community</name>
+ <url>https://geronimo.apache.org</url>
+ <organization>Apache</organization>
+ </developer>
+ </developers>
+
+ <issueManagement>
+ <system>ASF JIRA</system>
+ <url>https://issues.apache.org/jira/browse/GERONIMO</url>
+ </issueManagement>
+</project>
diff --git a/src/main/java/org/apache/geronimo/microprofile/impl/health/cdi/GeronimoHealthExtension.java b/src/main/java/org/apache/geronimo/microprofile/impl/health/cdi/GeronimoHealthExtension.java
new file mode 100644
index 0000000..40bc569
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/impl/health/cdi/GeronimoHealthExtension.java
@@ -0,0 +1,87 @@
+/**
+ * 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.geronimo.microprofile.impl.health.cdi;
+
+import static java.util.stream.Collectors.toList;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterDeploymentValidation;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeShutdown;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.ProcessBean;
+
+import org.eclipse.microprofile.health.Health;
+import org.eclipse.microprofile.health.HealthCheck;
+
+public class GeronimoHealthExtension implements Extension {
+ private final Collection<Bean<?>> beans = new ArrayList<>();
+ private final Collection<CreationalContext<?>> contexts = new ArrayList<>();
+ private List<HealthCheck> checks;
+
+ void findChecks(@Observes final ProcessBean<?> bean) {
+ if (bean.getAnnotated().isAnnotationPresent(Health.class) && bean.getBean().getTypes().contains(HealthCheck.class)) {
+ beans.add(bean.getBean());
+ }
+ }
+
+ void start(@Observes final AfterDeploymentValidation afterDeploymentValidation, final BeanManager beanManager) {
+ checks = beans.stream()
+ .map(it -> lookup(it, beanManager))
+ .collect(toList());
+ }
+
+ void stop(@Observes final BeforeShutdown beforeShutdown) {
+ final IllegalStateException ise = new IllegalStateException("Something went wrong releasing health checks");
+ contexts.forEach(c -> {
+ try {
+ c.release();
+ } catch (final RuntimeException re) {
+ ise.addSuppressed(re);
+ }
+ });
+ final Throwable[] suppressed = ise.getSuppressed();
+ if (suppressed.length == 1) {
+ throw RuntimeException.class.cast(suppressed[0]);
+ } else if (suppressed.length > 1) {
+ throw ise;
+ }
+ }
+
+ public List<HealthCheck> getChecks() {
+ return checks;
+ }
+
+ private HealthCheck lookup(final Bean<?> bean, final BeanManager manager) {
+ final Class<?> type = bean.getBeanClass() == null ? HealthCheck.class : bean.getBeanClass();
+ final Set<Bean<?>> beans = manager.getBeans(type, bean.getQualifiers().toArray(new Annotation[bean.getQualifiers().size()]));
+ final Bean<?> resolvedBean = manager.resolve(beans);
+ final CreationalContext<Object> creationalContext = manager.createCreationalContext(null);
+ if (!manager.isNormalScope(resolvedBean.getScope())) {
+ contexts.add(creationalContext);
+ }
+ return HealthCheck.class.cast(manager.getReference(resolvedBean, HealthCheck.class, creationalContext));
+ }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseBuilderImpl.java b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseBuilderImpl.java
new file mode 100644
index 0000000..7e69da6
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseBuilderImpl.java
@@ -0,0 +1,85 @@
+/**
+ * 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.geronimo.microprofile.impl.health.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.microprofile.health.HealthCheckResponse;
+import org.eclipse.microprofile.health.HealthCheckResponseBuilder;
+
+public class HealthCheckResponseBuilderImpl extends HealthCheckResponseBuilder {
+ private HealthCheckResponseImpl response = new HealthCheckResponseImpl();
+
+ @Override
+ public HealthCheckResponseBuilder name(final String name) {
+ response.setName(name);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder withData(final String key, final String value) {
+ data().put(key, value);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder withData(final String key, final long value) {
+ data().put(key, value);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder withData(final String key, final boolean value) {
+ data().put(key, value);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder up() {
+ response.setState(HealthCheckResponse.State.UP);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder down() {
+ response.setState(HealthCheckResponse.State.DOWN);
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponseBuilder state(final boolean up) {
+ if (up) {
+ up();
+ } else {
+ down();
+ }
+ return this;
+ }
+
+ @Override
+ public HealthCheckResponse build() {
+ return response;
+ }
+
+ private Map<String, Object> data() {
+ if (response.getRawData() == null) {
+ response.setData(new HashMap<>());
+ }
+ return response.getRawData();
+ }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseImpl.java b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseImpl.java
new file mode 100644
index 0000000..aa927dd
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseImpl.java
@@ -0,0 +1,64 @@
+/**
+ * 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.geronimo.microprofile.impl.health.impl;
+
+import java.util.Map;
+import java.util.Optional;
+
+import javax.json.bind.annotation.JsonbProperty;
+import javax.json.bind.annotation.JsonbTransient;
+
+import org.eclipse.microprofile.health.HealthCheckResponse;
+
+public class HealthCheckResponseImpl extends HealthCheckResponse {
+ private String name;
+ private State state;
+ private Map<String, Object> data;
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public State getState() {
+ return state;
+ }
+
+ @JsonbProperty("data")
+ public Map<String, Object> getRawData() {
+ return data;
+ }
+
+ @Override
+ @JsonbTransient
+ public Optional<Map<String, Object>> getData() {
+ return Optional.ofNullable(data);
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public void setState(final State state) {
+ this.state = state;
+ }
+
+ public void setData(final Map<String, Object> data) {
+ this.data = data;
+ }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseProviderImpl.java b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseProviderImpl.java
new file mode 100644
index 0000000..c22c651
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/impl/health/impl/HealthCheckResponseProviderImpl.java
@@ -0,0 +1,27 @@
+/**
+ * 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.geronimo.microprofile.impl.health.impl;
+
+import org.eclipse.microprofile.health.HealthCheckResponseBuilder;
+import org.eclipse.microprofile.health.spi.HealthCheckResponseProvider;
+
+public class HealthCheckResponseProviderImpl implements HealthCheckResponseProvider {
+ @Override
+ public HealthCheckResponseBuilder createResponseBuilder() {
+ return new HealthCheckResponseBuilderImpl();
+ }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/impl/health/jaxrs/HealthChecksEndpoint.java b/src/main/java/org/apache/geronimo/microprofile/impl/health/jaxrs/HealthChecksEndpoint.java
new file mode 100644
index 0000000..bde8326
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/impl/health/jaxrs/HealthChecksEndpoint.java
@@ -0,0 +1,81 @@
+/**
+ * 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.geronimo.microprofile.impl.health.jaxrs;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.geronimo.microprofile.impl.health.cdi.GeronimoHealthExtension;
+import org.eclipse.microprofile.health.HealthCheck;
+import org.eclipse.microprofile.health.HealthCheckResponse;
+
+@Path("health")
+@ApplicationScoped
+public class HealthChecksEndpoint {
+ @Inject
+ private GeronimoHealthExtension extension;
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getChecks() {
+ final List<HealthCheckResponse> checks = extension.getChecks()
+ .stream()
+ .map(HealthCheck::call)
+ .collect(toList());
+ final HealthCheckResponse.State globalState = checks.stream()
+ .reduce(HealthCheckResponse.State.UP, (a, b) -> combine(a, b.getState()), this::combine);
+ return Response.status(globalState == HealthCheckResponse.State.DOWN ? Response.Status.SERVICE_UNAVAILABLE : Response.Status.OK).entity(new AggregatedResponse(globalState, checks)).build();
+ }
+
+ private HealthCheckResponse.State combine(final HealthCheckResponse.State a, final HealthCheckResponse.State b) {
+ return a == HealthCheckResponse.State.DOWN || b == HealthCheckResponse.State.DOWN ? HealthCheckResponse.State.DOWN : a;
+ }
+
+ public static class AggregatedResponse {
+ private HealthCheckResponse.State status;
+ private Collection<HealthCheckResponse> checks;
+
+ private AggregatedResponse(final HealthCheckResponse.State state,
+ final Collection<HealthCheckResponse> checks) {
+ this.status = state;
+ this.checks = checks;
+ }
+
+ public HealthCheckResponse.State getStatus() {
+ return status;
+ }
+
+ @Deprecated
+ public HealthCheckResponse.State getOutcome() {
+ return status;
+ }
+
+ public Collection<HealthCheckResponse> getChecks() {
+ return checks;
+ }
+ }
+}
diff --git a/src/main/resources/META-INF/beans.xml b/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..70dd4a9
--- /dev/null
+++ b/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://xmlns.jcp.org/xml/ns/javaee
+ http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
+ bean-discovery-mode="all"
+ version="2.0">
+ <trim/>
+</beans>
diff --git a/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
new file mode 100644
index 0000000..611f876
--- /dev/null
+++ b/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.impl.health.cdi.GeronimoHealthExtension
diff --git a/src/main/resources/META-INF/services/org.eclipse.microprofile.health.spi.HealthCheckResponseProvider b/src/main/resources/META-INF/services/org.eclipse.microprofile.health.spi.HealthCheckResponseProvider
new file mode 100644
index 0000000..e8b051a
--- /dev/null
+++ b/src/main/resources/META-INF/services/org.eclipse.microprofile.health.spi.HealthCheckResponseProvider
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.impl.health.impl.HealthCheckResponseProviderImpl
diff --git a/src/test/resources/arquillian.xml b/src/test/resources/arquillian.xml
new file mode 100644
index 0000000..71adc2b
--- /dev/null
+++ b/src/test/resources/arquillian.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ 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.
+-->
+<arquillian xmlns="http://jboss.org/schema/arquillian"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://jboss.org/schema/arquillian
+ http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
+ <container qualifier="default" default="true">
+ <configuration>
+ <property name="tempDir">target/meecrowave/temp</property>
+ <property name="scanningExcludes">
+ org.osgi,
+ arquillian,
+ microprofile-
+ </property>
+ </configuration>
+ </container>
+</arquillian>