diff --git a/all/build.gradle.kts b/all/build.gradle.kts index b21a619bab5..00f48fe9a02 100644 --- a/all/build.gradle.kts +++ b/all/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "OpenTelemetry All" otelJava.moduleName.set("io.opentelemetry.all") +otelJava.osgiEnabled.set(false) // Skip ossIndexAudit on test module tasks.named("ossIndexAudit") { diff --git a/animal-sniffer-signature/build.gradle.kts b/animal-sniffer-signature/build.gradle.kts index 82f84e0edae..6c192c5246c 100644 --- a/animal-sniffer-signature/build.gradle.kts +++ b/animal-sniffer-signature/build.gradle.kts @@ -8,6 +8,7 @@ plugins { description = "Build tool to generate the Animal Sniffer Android signature" otelJava.moduleName.set("io.opentelemetry.internal.animalsniffer") +otelJava.osgiEnabled.set(false) val signatureJar = configurations.create("signatureJar") { isCanBeConsumed = false diff --git a/api/all/build.gradle.kts b/api/all/build.gradle.kts index ad6896387d8..c6dfcbe8da1 100644 --- a/api/all/build.gradle.kts +++ b/api/all/build.gradle.kts @@ -9,6 +9,10 @@ plugins { description = "OpenTelemetry API" otelJava.moduleName.set("io.opentelemetry.api") base.archivesName.set("opentelemetry-api") +// These packages cannot be compileOnly dependencies (api:incubator depends on api:all, creating a +// circular dependency; sdk:autoconfigure is in a different module family). Declare them as optional +// imports without a version constraint so OSGi wires them if present but does not require them. +otelJava.osgiUnversionedOptionalPackages.set(listOf("io.opentelemetry.sdk.autoconfigure", "io.opentelemetry.api.incubator", "io.opentelemetry.api.incubator.internal")) dependencies { api(project(":context")) diff --git a/api/incubator/build.gradle.kts b/api/incubator/build.gradle.kts index 6bd0669222d..b4e4003299b 100644 --- a/api/incubator/build.gradle.kts +++ b/api/incubator/build.gradle.kts @@ -8,6 +8,7 @@ plugins { description = "OpenTelemetry API Incubator" otelJava.moduleName.set("io.opentelemetry.api.incubator") +otelJava.osgiOptionalPackages.set(listOf("com.fasterxml.jackson.databind")) dependencies { api(project(":api:all")) diff --git a/api/testing-internal/build.gradle.kts b/api/testing-internal/build.gradle.kts index 6098501ea03..fb38ce6aa28 100644 --- a/api/testing-internal/build.gradle.kts +++ b/api/testing-internal/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "OpenTelemetry API Testing (Internal)" otelJava.moduleName.set("io.opentelemetry.api.testing.internal") +otelJava.osgiEnabled.set(false) dependencies { api(project(":api:all")) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 9c112bf94b1..2860a3399f9 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -33,6 +33,7 @@ repositories { } dependencies { + implementation("biz.aQute.bnd:biz.aQute.bnd.gradle:7.2.0") implementation(enforcedPlatform("com.squareup.wire:wire-bom:6.2.0")) implementation("com.google.auto.value:auto-value-annotations:1.11.1") // When updating, update above in plugins too diff --git a/buildSrc/src/main/kotlin/io/opentelemetry/gradle/OtelJavaExtension.kt b/buildSrc/src/main/kotlin/io/opentelemetry/gradle/OtelJavaExtension.kt index cf45d5a2725..025391bbd6c 100644 --- a/buildSrc/src/main/kotlin/io/opentelemetry/gradle/OtelJavaExtension.kt +++ b/buildSrc/src/main/kotlin/io/opentelemetry/gradle/OtelJavaExtension.kt @@ -6,14 +6,29 @@ package io.opentelemetry.gradle import org.gradle.api.JavaVersion +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property abstract class OtelJavaExtension { abstract val moduleName: Property + // Set to false for modules that are not OSGi bundles (e.g. test helpers, build tooling, + // aggregators). Skips BND bundle metadata generation entirely. + abstract val osgiEnabled: Property + + abstract val osgiOptionalPackages: ListProperty + + // Packages that should be optional imports but are not on the compile classpath (e.g. due to + // circular dependencies), so BND cannot resolve version="${@}" for them. Added to Import-Package + // with resolution:=optional but no version constraint. + abstract val osgiUnversionedOptionalPackages: ListProperty + abstract val minJavaVersionSupported: Property init { minJavaVersionSupported.convention(JavaVersion.VERSION_1_8) + osgiEnabled.convention(true) + osgiOptionalPackages.convention(emptyList()) + osgiUnversionedOptionalPackages.convention(emptyList()) } } diff --git a/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts index 83d4bf59c91..36100dcd887 100644 --- a/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts @@ -9,6 +9,7 @@ plugins { eclipse idea + id("biz.aQute.bnd.builder") id("otel.errorprone-conventions") id("otel.jacoco-conventions") id("otel.spotless-conventions") @@ -131,6 +132,38 @@ tasks { } } + afterEvaluate { + if (otelJava.osgiEnabled.get()) { + named("jar") { + // Configure OSGi metadata + bundle { + // Compute import packages. + // Certain packages like javax.annotation.* are always optional. + // Modules may have additional optional packages, typically corresponding to compileOnly dependencies. + // Append wildcard "*" last to import any other referenced packages. + val optionalPackages = mutableListOf("javax.annotation") + optionalPackages.addAll(otelJava.osgiOptionalPackages.get()) + val importPackages = optionalPackages.joinToString(",") { "$it.*;resolution:=optional;version=\"\${@}\"" } + ",*" + + // Packages not on the compile classpath (e.g. due to circular dependencies) cannot use + // version="${@}" since BND cannot resolve the version. Add them as optional imports without + // a version constraint; they are listed before the wildcard so BND uses our explicit + // instruction rather than auto-detecting them with a version. + val unversionedOptionalPackages = otelJava.osgiUnversionedOptionalPackages.get() + val unversionedImports = unversionedOptionalPackages.joinToString(",") { "$it.*;resolution:=optional" } + val fullImportPackages = if (unversionedImports.isNotEmpty()) "$unversionedImports,$importPackages" else importPackages + + bnd(mapOf( + // Exclude shaded internal packages from exports; they are implementation details and + // should not be part of the OSGi bundle's public API surface. + "-exportcontents" to "!io.opentelemetry.internal.shaded.*,io.opentelemetry.*", + "Import-Package" to fullImportPackages + )) + } + } + } + } + withType().configureEach { inputs.property("moduleName", otelJava.moduleName) diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index 77fe221f9b3..742735b2848 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -36,6 +36,7 @@ val DEPENDENCY_BOMS = listOf( "io.zipkin.brave:brave-bom:6.3.1", "io.zipkin.reporter2:zipkin-reporter-bom:3.5.3", "org.assertj:assertj-bom:3.27.7", + "org.osgi:org.osgi.test.bom:1.2.1", "org.testcontainers:testcontainers-bom:2.0.4", "org.snakeyaml:snakeyaml-engine:2.10" ) @@ -88,11 +89,13 @@ val DEPENDENCIES = listOf( "io.opentracing:opentracing-noop:0.33.0", "junit:junit:4.13.2", "nl.jqno.equalsverifier:equalsverifier:3.19.4", + "org.apache.felix:org.apache.felix.framework:7.0.5", "org.awaitility:awaitility:4.3.0", "org.codehaus.mojo:animal-sniffer-annotations:1.27", "org.jctools:jctools-core:4.0.6", "org.junit-pioneer:junit-pioneer:1.9.1", "org.mock-server:mockserver-netty:5.15.0:shaded", + "org.osgi:osgi.core:8.0.0", "org.skyscreamer:jsonassert:1.5.3", "com.android.tools:desugar_jdk_libs:2.1.5", ) diff --git a/exporters/common/compile-stub/build.gradle.kts b/exporters/common/compile-stub/build.gradle.kts index f93bd1883c9..5b2a1c921ee 100644 --- a/exporters/common/compile-stub/build.gradle.kts +++ b/exporters/common/compile-stub/build.gradle.kts @@ -4,3 +4,4 @@ plugins { description = "OpenTelemetry Exporter Compile Stub" otelJava.moduleName.set("io.opentelemetry.exporter.internal.compile-stub") +otelJava.osgiEnabled.set(false) diff --git a/integration-tests/build.gradle.kts b/integration-tests/build.gradle.kts index c9dfab1d920..2ddb84f0b44 100644 --- a/integration-tests/build.gradle.kts +++ b/integration-tests/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "OpenTelemetry Integration Tests" otelJava.moduleName.set("io.opentelemetry.integration.tests") +otelJava.osgiEnabled.set(false) dependencies { testImplementation(project(":sdk:all")) diff --git a/integration-tests/graal-incubating/build.gradle.kts b/integration-tests/graal-incubating/build.gradle.kts index 8b2153620c4..d097a9b37ab 100644 --- a/integration-tests/graal-incubating/build.gradle.kts +++ b/integration-tests/graal-incubating/build.gradle.kts @@ -7,6 +7,7 @@ plugins { description = "OpenTelemetry Graal Integration Tests (Incubating)" otelJava.moduleName.set("io.opentelemetry.graal.integration.tests.incubating") +otelJava.osgiEnabled.set(false) otelJava.minJavaVersionSupported.set(JavaVersion.VERSION_17) sourceSets { diff --git a/integration-tests/graal/build.gradle.kts b/integration-tests/graal/build.gradle.kts index 99c86443ebf..bfa31e5a26f 100644 --- a/integration-tests/graal/build.gradle.kts +++ b/integration-tests/graal/build.gradle.kts @@ -7,6 +7,7 @@ plugins { description = "OpenTelemetry Graal Integration Tests" otelJava.moduleName.set("io.opentelemetry.graal.integration.tests") +otelJava.osgiEnabled.set(false) otelJava.minJavaVersionSupported.set(JavaVersion.VERSION_17) sourceSets { diff --git a/integration-tests/osgi/build.gradle.kts b/integration-tests/osgi/build.gradle.kts new file mode 100644 index 00000000000..187383a9332 --- /dev/null +++ b/integration-tests/osgi/build.gradle.kts @@ -0,0 +1,111 @@ +import aQute.bnd.gradle.Bundle +import aQute.bnd.gradle.Resolve +import aQute.bnd.gradle.TestOSGi + +plugins { + id("otel.java-conventions") +} + +description = "OpenTelemetry OSGi Integration Tests" +otelJava.moduleName.set("io.opentelemetry.integration.tests.osgi") + +// For similar test examples see: +// https://github.com/micrometer-metrics/micrometer/tree/main/micrometer-osgi-test +// https://github.com/eclipse-osgi-technology/osgi-test/tree/main/examples/osgi-test-example-gradle + +configurations.all { + resolutionStrategy { + // BND not compatible with JUnit 5.13+; see https://github.com/bndtools/bnd/issues/6651 + val junitVersion = "5.12.2" + val junitLauncherVersion = "1.12.1" + force("org.junit.jupiter:junit-jupiter:$junitVersion") + force("org.junit.jupiter:junit-jupiter-api:$junitVersion") + force("org.junit.jupiter:junit-jupiter-params:$junitVersion") + force("org.junit.jupiter:junit-jupiter-engine:$junitVersion") + force("org.junit.platform:junit-platform-launcher:$junitLauncherVersion") + } +} + +dependencies { + // Testing the "kitchen sink" hides OSGi configuration issues. For example, opentelemetry-api has + // optional dependencies on :sdk-extensions:autoconfigure and :api:incubator. If we only test a + // bundle which includes those, then mask the fact that OSGi fails when using a bundle without those + // until opentelemetry-api OSGi configuration is updated to indicate that they are optional. + + // TODO (jack-berg): Add additional test bundles with dependency combinations reflecting popular use cases: + // - with OTLP exporters + // - with autoconfigure + // - with file configuration + testImplementation(project(":sdk:all")) + + testImplementation("org.junit.jupiter:junit-jupiter") + + testCompileOnly("org.osgi:osgi.core") + testImplementation("org.osgi:org.osgi.test.junit5") + testImplementation("org.osgi:org.osgi.test.assertj.framework") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testRuntimeOnly("org.apache.felix:org.apache.felix.framework") +} + +val testingBundleTask = tasks.register("testingBundle") { + archiveClassifier.set("testing") + from(sourceSets.test.get().output) + bundle { + // The Bundle task uses compileClasspath by default for BND analysis (e.g. resolving the + // @Testable annotation to populate Test-Cases). Without this, testImplementation dependencies + // like junit-jupiter are invisible to BND, causing Test-Cases to be empty and 0 tests to run. + classpath(sourceSets.test.get().runtimeClasspath) + bnd( + "Test-Cases: \${classes;HIERARCHY_INDIRECTLY_ANNOTATED;org.junit.platform.commons.annotation.Testable;CONCRETE}", + "Import-Package: javax.annotation.*;resolution:=optional;version=\"\${@}\",*" + ) + } +} + +val resolveTask = tasks.register("resolve") { + dependsOn(testingBundleTask) + project.ext.set("osgiRunee", "JavaSE-${java.toolchain.languageVersion.get()}") + description = "Resolve test.bndrun" + group = JavaBasePlugin.VERIFICATION_GROUP + bndrun = file("test.bndrun") + outputBndrun = layout.buildDirectory.file("test.bndrun") + bundles = files(sourceSets.test.get().runtimeClasspath, testingBundleTask.get().archiveFile) + // The generated output embeds an absolute path to the source bndrun, making it unsafe to share + // across machines or worktrees via the build cache. + outputs.cacheIf { false } +} + +val testOSGiTask = tasks.register("testOSGi") { + description = "OSGi Test test.bndrun" + group = JavaBasePlugin.VERIFICATION_GROUP + bndrun = resolveTask.flatMap { it.outputBndrun } + bundles = files(sourceSets.test.get().runtimeClasspath, testingBundleTask.get().archiveFile) + // BND reports success when zero tests ran (e.g. if bundles failed to start). Fail explicitly. + val testResultsDir = layout.buildDirectory.dir("test-results/testOSGi") + doLast { + check(testResultsDir.get().asFile.listFiles()?.isNotEmpty() == true) { + "No OSGi test results found — bundles may have failed to start. Check the output above." + } + } +} + +tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { + dependsOn(testOSGiTask) +} + +tasks { + jar { + enabled = false + } + test { + // We need to replace junit testing with the testOSGi task, so we clear test actions and add a dependency on testOSGi. + // As a result, running :test runs only :testOSGi. + actions.clear() + dependsOn(testOSGiTask) + } +} + +// Skip ossIndexAudit on test module +tasks.named("ossIndexAudit") { + enabled = false +} diff --git a/integration-tests/osgi/src/test/java/io/opentelemetry/integrationtest/osgi/OpenTelemetryOsgiTest.java b/integration-tests/osgi/src/test/java/io/opentelemetry/integrationtest/osgi/OpenTelemetryOsgiTest.java new file mode 100644 index 00000000000..7cb6c388491 --- /dev/null +++ b/integration-tests/osgi/src/test/java/io/opentelemetry/integrationtest/osgi/OpenTelemetryOsgiTest.java @@ -0,0 +1,130 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.integrationtest.osgi; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.logs.SdkLoggerProvider; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import io.opentelemetry.sdk.logs.export.LogRecordExporter; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; +import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.data.AggregationTemporality; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.MetricExporter; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import java.util.Collection; +import javax.annotation.Nullable; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.osgi.framework.BundleContext; +import org.osgi.test.common.annotation.InjectBundleContext; +import org.osgi.test.junit5.context.BundleContextExtension; +import org.osgi.test.junit5.service.ServiceExtension; + +@ExtendWith(BundleContextExtension.class) +@ExtendWith(ServiceExtension.class) +public class OpenTelemetryOsgiTest { + + @InjectBundleContext @Nullable BundleContext bundleContext; + + @BeforeEach + void setup() { + // Verify we're in an OSGi environment + assertThat(bundleContext).isNotNull(); + } + + @Test + public void vanillaSdkInitializes() { + OpenTelemetrySdk sdk = + OpenTelemetrySdk.builder() + .setMeterProvider( + SdkMeterProvider.builder() + .registerMetricReader( + PeriodicMetricReader.create( + new MetricExporter() { + @Override + public CompletableResultCode export(Collection metrics) { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public AggregationTemporality getAggregationTemporality( + InstrumentType instrumentType) { + return AggregationTemporality.CUMULATIVE; + } + })) + .build()) + .setLoggerProvider( + SdkLoggerProvider.builder() + .addLogRecordProcessor( + SimpleLogRecordProcessor.create( + new LogRecordExporter() { + @Override + public CompletableResultCode export(Collection logs) { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + })) + .build()) + .setTracerProvider( + SdkTracerProvider.builder() + .addSpanProcessor( + SimpleSpanProcessor.create( + new SpanExporter() { + @Override + public CompletableResultCode export(Collection spans) { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode flush() { + return CompletableResultCode.ofSuccess(); + } + + @Override + public CompletableResultCode shutdown() { + return CompletableResultCode.ofSuccess(); + } + })) + .build()) + .build(); + + assertThat(sdk).isNotNull(); + + // Verify Context API is available + Context current = Context.current(); + assertThat(current).isNotNull(); + } +} diff --git a/integration-tests/osgi/test.bndrun b/integration-tests/osgi/test.bndrun new file mode 100644 index 00000000000..8a148d32d39 --- /dev/null +++ b/integration-tests/osgi/test.bndrun @@ -0,0 +1,8 @@ +-tester: biz.aQute.tester.junit-platform +-runfw: org.apache.felix.framework +-runee: ${project.osgiRunee} + +-runrequires: \ + bnd.identity;id='opentelemetry-osgi-testing',\ + bnd.identity;id='junit-jupiter-engine',\ + bnd.identity;id='junit-platform-launcher' diff --git a/integration-tests/otlp/build.gradle.kts b/integration-tests/otlp/build.gradle.kts index bdc208a5392..96001fc5a24 100644 --- a/integration-tests/otlp/build.gradle.kts +++ b/integration-tests/otlp/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "OTLP Exporter Integration Tests" otelJava.moduleName.set("io.opentelemetry.integration.tests.otlp") +otelJava.osgiEnabled.set(false) dependencies { api("org.testcontainers:testcontainers-junit-jupiter") diff --git a/javadoc-crawler/build.gradle.kts b/javadoc-crawler/build.gradle.kts index e76591abf24..bae241198b3 100644 --- a/javadoc-crawler/build.gradle.kts +++ b/javadoc-crawler/build.gradle.kts @@ -11,6 +11,7 @@ dependencies { description = "OpenTelemetry Javadoc Crawler" otelJava.moduleName.set("io.opentelemetry.javadocs") +otelJava.osgiEnabled.set(false) otelJava.minJavaVersionSupported.set(JavaVersion.VERSION_17) tasks { diff --git a/perf-harness/build.gradle.kts b/perf-harness/build.gradle.kts index c73ec2ad29c..ebb9c5f26de 100644 --- a/perf-harness/build.gradle.kts +++ b/perf-harness/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "Performance Testing Harness" otelJava.moduleName.set("io.opentelemetry.perf-harness") +otelJava.osgiEnabled.set(false) dependencies { implementation(project(":api:all")) diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index 8ef186ee14e..8a0e2794593 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -5,6 +5,7 @@ plugins { description = "OpenTelemetry SDK Auto-configuration" otelJava.moduleName.set("io.opentelemetry.sdk.autoconfigure") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.sdk.extension.incubator")) dependencies { api(project(":sdk:all")) diff --git a/sdk/all/build.gradle.kts b/sdk/all/build.gradle.kts index 3a19758f313..313726e1723 100644 --- a/sdk/all/build.gradle.kts +++ b/sdk/all/build.gradle.kts @@ -9,6 +9,7 @@ plugins { description = "OpenTelemetry SDK" otelJava.moduleName.set("io.opentelemetry.sdk") base.archivesName.set("opentelemetry-sdk") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.api.incubator")) dependencies { api(project(":api:all")) diff --git a/sdk/common/build.gradle.kts b/sdk/common/build.gradle.kts index 8570cbe7148..e695eaf1d83 100644 --- a/sdk/common/build.gradle.kts +++ b/sdk/common/build.gradle.kts @@ -10,6 +10,7 @@ apply() description = "OpenTelemetry SDK Common" otelJava.moduleName.set("io.opentelemetry.sdk.common") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.api.incubator")) dependencies { api(project(":api:all")) diff --git a/sdk/logs/build.gradle.kts b/sdk/logs/build.gradle.kts index b205b03e90e..6754edc5113 100644 --- a/sdk/logs/build.gradle.kts +++ b/sdk/logs/build.gradle.kts @@ -8,6 +8,7 @@ plugins { description = "OpenTelemetry Log SDK" otelJava.moduleName.set("io.opentelemetry.sdk.logs") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.api.incubator")) dependencies { api(project(":api:all")) diff --git a/sdk/metrics/build.gradle.kts b/sdk/metrics/build.gradle.kts index ae1c59f7978..25f91100f7a 100644 --- a/sdk/metrics/build.gradle.kts +++ b/sdk/metrics/build.gradle.kts @@ -9,6 +9,7 @@ plugins { description = "OpenTelemetry SDK Metrics" otelJava.moduleName.set("io.opentelemetry.sdk.metrics") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.api.incubator")) dependencies { api(project(":api:all")) diff --git a/sdk/trace-shaded-deps/build.gradle.kts b/sdk/trace-shaded-deps/build.gradle.kts index 6e3abea489b..e3a47fb8e6e 100644 --- a/sdk/trace-shaded-deps/build.gradle.kts +++ b/sdk/trace-shaded-deps/build.gradle.kts @@ -8,6 +8,7 @@ plugins { description = "Internal use only - shaded dependencies of OpenTelemetry SDK for Tracing" otelJava.moduleName.set("io.opentelemetry.sdk.trace.internal") +otelJava.osgiEnabled.set(false) dependencies { implementation("org.jctools:jctools-core") diff --git a/sdk/trace/build.gradle.kts b/sdk/trace/build.gradle.kts index 5dac8fbeb81..b548c56cd69 100644 --- a/sdk/trace/build.gradle.kts +++ b/sdk/trace/build.gradle.kts @@ -8,6 +8,7 @@ plugins { description = "OpenTelemetry SDK For Tracing" otelJava.moduleName.set("io.opentelemetry.sdk.trace") +otelJava.osgiOptionalPackages.set(listOf("io.opentelemetry.api.incubator")) sourceSets { main { diff --git a/settings.gradle.kts b/settings.gradle.kts index 8ba7a5f6003..40aee0f3d22 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -54,6 +54,7 @@ include(":integration-tests:otlp") include(":integration-tests:tracecontext") include(":integration-tests:graal") include(":integration-tests:graal-incubating") +include(":integration-tests:osgi") include(":javadoc-crawler") include(":opencensus-shim") include(":opentracing-shim") diff --git a/testing-internal/build.gradle.kts b/testing-internal/build.gradle.kts index 6a0cd9521ec..c1dc9ebe96c 100644 --- a/testing-internal/build.gradle.kts +++ b/testing-internal/build.gradle.kts @@ -4,6 +4,7 @@ plugins { description = "OpenTelemetry Testing (Internal)" otelJava.moduleName.set("io.opentelemetry.internal.testing") +otelJava.osgiEnabled.set(false) dependencies { api("org.junit.jupiter:junit-jupiter-api")