Skip to content

java.lang.NoClassDefFoundError: com/google/auth/Credentials error connecting to BigQuery CDM with WebAPI #2501

@yuriautsumi

Description

@yuriautsumi

I have built my ATLAS dataset (OMOP CDM dataset) and run Achilles on it. The tables are stored in BigQuery.

I then built WebAPI from Broadsea on my local machine with the following changes but got an error when trying to make GET requests to the CDM or Achilles tables.

Steps to Setup WebAPI on Local Machine

Changes to files and specific commands are described in the Appendix section. The WebAPI request and error message are described in the WebAPI Request section.

  1. Clone WebAPI to local.
  2. Download the BigQuery drivers using the DatabaseConnector library using the steps explained here to src/main/extras/bigquery directory of my local copy of WebAPI. I copied to this directory because of the BigQuery JDBC driver path specified in pom.xml.
  3. Clone Broadsea to local.
  4. Edit ohdsi-webapi.yml to mount the service account key file used to authenticate to BigQuery in the JDBC string.
  5. The Broadsea image is built with default profile, and the WebAPI image is built from the local copy.
  6. CDM connections are set up using these instructions. The JDBC string I use was already tested previously to run Achilles, and it worked.

Appendix

Step 4:
.env

WEBAPI_BIGQUERY_KEYFILE=${PATH_TO_SERVICE_ACCOUNT_KEY_FILE}
WEBAPI_ADDITIONAL_JDBC_FILE_PATH=${PATH_TO_DOWNLOADED_BIGQUERY_JDBC_FILE}  # File: GoogleBigQueryJDBC42.jar

compose/ohdsi-webapi.yml

services:
  ohdsi-webapi:
    ...
    volumes:
      - ${WEBAPI_BIGQUERY_KEYFILE}:/var/lib/ohdsi/webapi/config/bigquery_keyfile.json

Step 5:

$ cd Broadsea
$ docker compose --profile default up -d
$ docker compose --profile webapi-from-git up -d

Step 6:

jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId={projectId};OAuthType=0;OAuthPvtKeyPath={keyFileName};OAuthServiceAcctEmail={serviceAccountEmail};EnableSession=1;

WebAPI Request

I make an API request to the data density report and get the following result.

API request:

$ curl https://127.0.0.1/WebAPI/cdmresults/MY_CDM/datadensity/

Returned payload:

{
  "payload": {
    "cause": null,
    "stackTrace": [],
    "message": "An exception occurred: java.lang.NoClassDefFoundError",
    "localizedMessage": "An exception occurred: java.lang.NoClassDefFoundError",
    "suppressed": []
  },
  "headers": {
    "id": "352e95df-5d24-a2d4-ff59-876150a90e77",
    "timestamp": 1775348505095
  }
}

Error:

There is a file called google-auth-library-credentials-1.28.0.jar that was downloaded and copied to local WebAPI directory in step 2 before building the image in step 5.

2026-04-05 00:21:42.692 ERROR http-nio-8080-exec-3 org.ohdsi.webapi.util.GenericExceptionMapper - [] - java.lang.NoClassDefFoundError: com/google/auth/Credentials

	at com.simba.googlebigquery.googlebigquery.core.BQConnection.connect(Unknown Source)

	at com.simba.googlebigquery.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)

	at com.simba.googlebigquery.jdbc.common.AbstractDriver.connect(Unknown Source)

	at java.sql.DriverManager.getConnection(DriverManager.java:664)

	at java.sql.DriverManager.getConnection(DriverManager.java:208)

	at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)

	at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)

	at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:196)

	at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:159)

	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)

	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)

	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:624)

	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:688)

	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:720)

	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:770)

	at org.ohdsi.webapi.report.CDMResultsAnalysisRunner.getDataDensityResults(CDMResultsAnalysisRunner.java:127)

	at org.ohdsi.webapi.service.CDMResultsService.getRawDataDesity(CDMResultsService.java:341)

	at org.ohdsi.webapi.service.CDMResultsService.getDataDensity(CDMResultsService.java:336)

	at org.ohdsi.webapi.service.CDMResultsService$$FastClassBySpringCGLIB$$f65c71c1.invoke(<generated>)

	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)

	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)

	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)

	at org.ohdsi.webapi.achilles.aspect.AchillesCacheAspect.cache(AchillesCacheAspect.java:56)

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

	at java.lang.reflect.Method.invoke(Method.java:498)

	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)

	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)

	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)

	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)

	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)

	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

Dependencies

> sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: aarch64-apple-darwin20
Running under: macOS 26.3.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: America/Chicago
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Achilles_1.7.2          DatabaseConnector_7.1.0

loaded via a namespace (and not attached):
 [1] R6_2.6.1             tidyselect_1.2.1     bit_4.6.0           
 [4] ParallelLogger_3.5.1 magrittr_2.0.3       glue_1.8.0          
 [7] tibble_3.2.1         pkgconfig_2.0.3      rJava_1.0-11        
[10] bit64_4.6.0-1        dplyr_1.1.4          generics_0.1.3      
[13] lifecycle_1.0.4      cli_3.6.4            vctrs_0.6.5         
[16] DBI_1.3.0            data.table_1.18.2.1  compiler_4.4.2      
[19] rstudioapi_0.17.1    pillar_1.10.1        rlang_1.1.5         
[22] SqlRender_1.19.4     dbplyr_2.5.1  

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions