Giter Site home page Giter Site logo

github-java-client's Introduction

release pipeline codecovLicense lifecycle: beta Maven Central

github-java-client

A small Java library for talking to GitHub/GitHub Enterprise and interacting with projects.

It supports authentication via simple access tokens, JWT endpoints and GitHub Apps (via private key).

It is also very light on GitHub, doing as few requests as necessary.

This library is maintained by @spotify/gjc-maintainers. If you have any questions, issues or need a review, please tag this team in the relevant PR/issue.

Getting Started

You can find this library in maven central repository.

Include the latest version of github-client into your project:

In Maven:

<dependency>
  <groupId>com.spotify</groupId>
  <artifactId>github-client</artifactId>
  <version>version</version>
</dependency>

Authenticating

Simple access token

final GitHubClient githubClient = GitHubClient.create(URI.create("https://api.github.com/"), "my-access-token");

Private key

To authenticate as a GitHub App, you must provide a private key and the App ID, together with the API URL.

final GitHubClient githubClient =
  GitHubClient.create(
    URI.create("https://api.github.com/"),
    new File("/path-to-the/private-key.pem"),
    APP_ID);

Then, you can scope the client for a specific Installation ID, to do the operations at the installation level. The client will manage the generation of JWT tokens, as well as requesting and caching the installation tokens from GitHub.

final GitHubClient scopedClient = GitHubClient.scopeForInstallationId(githubClient, INSTALLATION_ID);

It is also possible to provide the installation to the root client.

Refer to GitHub App Authentication Guide for more information.

Usage

This library attempts to mirror the structure of GitHub API endpoints. As an example, to get details of a Commit, there is the GET /repos/:owner/:repo/commits API call, under the repos API. Therefore, the getCommit method lives in the RepositoryClient.

final RepositoryClient repositoryClient = githubClient.createRepositoryClient("my-org", "my-repo");
log.info(repositoryClient.getCommit("sha").get().htmlUrl());

Another example of the mirrored structure is that some of the APIs are nested under a parent API. For example, endpoints related to check runs or issues are nested under the Repository client:

final ChecksClient checksClient = repositoryClient.createChecksApiClient();
checksClient.createCheckRun(CHECK_RUN_REQUEST);

final IssueClient issueClient = repositoryClient.createIssueClient();
issueClient.createComment(ISSUE_ID, "comment body")
  .thenAccept(comment -> log.info("created comment " + comment.htmlUrl()));

And endpoints related to teams and memberships are nested under the Organisation client:

final TeamClient teamClient = organisationClient.createTeamClient();
    teamClient.getMembership("username");

Supported Java versions

This library is written and published with Java version 11. In our CI workflows, we execute automated tests with the Java LTS versions 11, 17 and 21. Due to Java's backward compatibility, this library can definitely be used in all the tested versions.

Contributing

This project uses Maven. To run the tests locally, just run:

mvn clean verify

If you are a maintainer, you can release a new version by just triggering the workflow prepare-release through the web UI.

  • Select whether the new release should be a major, minor or patch release
  • Trigger the release preparation on the master branch
  • Pushes of this workflow will trigger runs of the maven-release workflow, which in turn will trigger the github-release workflow with the automatically created tag

Notes about maturity

This module was created after existing libraries were evaluated and dismissed, and we found that we were writing similar code in multiple projects. As such, it at least initially only contains enough functionality for our internal requirements which reflects that we were working on build system integration with the GitHub pull requests. It has been widely used for 4+ years. It's important to notice that it does not cover all GitHub v3 API. Adding missing endpoints should be very straightforward. Pull Requests are welcome.

Code of conduct

This project adheres to the Open Code of Conduct. By participating, you are expected to honor this code.

github-java-client's People

Contributors

abhi347 avatar backuitist avatar brunodea avatar chondent avatar dennisgranath avatar dependabot[bot] avatar dziemba avatar ebk45 avatar felix-seifert avatar henriquetruta avatar hewhomustnotbenamed avatar honnix avatar keero avatar lirick avatar martidis avatar mattnworb avatar mimfgg avatar miwurster avatar mkarimi23 avatar olbapmar avatar paulojean avatar samukce avatar sarlam avatar sathish-kumar-subramani avatar sergtanchenko avatar snyk-bot avatar tedyoung avatar thna123459 avatar vchernodon avatar vootelerotov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

github-java-client's Issues

Spring Boot config

I think the docs are probably still lacking OR I just didnt read them well enough; More likely there is no spring specific docs anyways...

Just posting this issue to help people get started with this with a spring boot app that handles webhooks.

import com.fasterxml.jackson.databind.Module; // Need this b/c by default java will want to use the java.lang.Module.
import com.spotify.github.jackson.GithubApiModule;

@Configuration
public class Configuration {
    /**
     * Need to register this bean so that isodates based through the webhook are understood by jackson.
     */
    @Bean
    public Module githubApiModule() {
        return new GithubApiModule();
    }
}
spring:
  jackson:
    property-naming-strategy: SNAKE_CASE # by default jackson wants LOWER_CAMEL_CASE, the events are not configured to deser using snakecase. This configures jackson to expect snakecase instead of camelcase.

These are 2 kind of "gotchas" that we ran into while trying to use this project for webhooks.

Support a way to only generate access tokens from installation

Hi, i'm playing with a use case in which i need to get an access token from a github application (appid and installation id), this access token is used to clone a repo, so i don't really need any more actions to be done on the github api (Besides getting the access token), i would really like to use this library for that purpose, is it possible?
I tried the following:

GitHubClient hubClient = GitHubClient.create(
    URI.create(GITHUB_ENDPOINT),
    new File(pemLocation),
    applicationId,
    installationId
);

SearchClient searchClient = hubClient.createSearchClient();
searchClient.users(ImmutableSearchParameters.builder().q("dumbdumb").build());

Optional<String> accessToken = hubClient.getAccessToken();

But the access token doesn't get populated

API calls github server endlessly

Good day,

I have a requirement to retrieve release information for the repo,

this is my implementation

public GHRelease getGitHubReleaseByRepositoryAndTagName(String repository, String tagName){
try {

        GitHub gitHub = getGitHub();
        //GHRepository repo = gitHub.getRepository(repository);



        GHRelease release = gitHub.getRepository(repository).getReleaseByTagName(tagName);
        if (Objects.nonNull(release)) {
            return release;
        }
            log.info( counter++ + " times" + String.valueOf(release));
       return release;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

private GitHub getGitHub()  {
    try {
       return new GitHubBuilder().withEndpoint(GITHUB_SERVER).withOAuthToken(TECHNICAL_PAT).build();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

when the code execute it is stuck on the endless loop for calling the server with returning the desired response

Bug: Accessing shaded OkHttpClient properties from Kotlin fails with `NoSuchMethodException`

Issue

Trying to access dispatcher property of the shaded OkHttpClient from Kotlin results in

java.lang.NoSuchMethodError: 'com.spotify.githubclient.shade.okhttp3.Dispatcher com.spotify.githubclient.shade.okhttp3.OkHttpClient.getDispatcher()

See reproducing test here.

Note that this also affects other fields in OkHttpClient.

Possible cause

In #157, the okhttp package was bumped from 3.x to 4.x.

In version 4.x of okhttp, the way Kotlin access to fields of OkHttpClient works was reworked for Kotlin, the direct access from Kotlin to the dispatcher method was deprecated:

  @JvmName("-deprecated_dispatcher")
  @Deprecated(
    message = "moved to val",
    replaceWith = ReplaceWith(expression = "dispatcher"),
    level = DeprecationLevel.ERROR,
  )
  fun dispatcher(): Dispatcher = dispatcher

Instead, the getter, that Kotlin generates for property access, was renamed to dispatcher:

  @get:JvmName("dispatcher")
  val dispatcher: Dispatcher = builder.dispatcher

See here for the class.

From Java point of view, nothing functionally changed -- previously dispatch() hit the manually added method, now dispatch() hit the getter generated by Kotlin with the same name.

However, from Kotlin, accessing dispatcher with dispatcher() is now a compile time error and instead one should use the property access syntax (okHttpClient.disptacher). This is exemplified in the reproducing test here.

In this project, the OkHttpClient is shaded into a different package. And I am speculating that the migration of packages does not cover all the metadata that Kotlin compiles into the class file. What seems to go missing is the information that dispatcher should be accessed by a method called dispatcher, instead of using the default name for property getter what would be getDispatcher -- this would explain the exception thrown.

In the reproducing test class, there is also one test that demonstrates that accessing metainfo about the property getter via kotlin-reflect does not succeed. This could also be explained by incomplete migration of packages.

Workaround

A Java class in (otherwise) Kotlin project, with static methods along the lines of:

    public static ExecutorService getExecutorService(Dispatcher dispatcher) {
        return dispatcher.executorService();
    }

Connection is leaking

I notice the error logs "A connection to http url was leaked when am using the library. Did you forget to close a response body?" is something am seeing while using the library. I don't see any close methods on the client and response is ignored while making API call to repoClient.setCommitStatus(). How is the library letting its users to close the http connections ?

IssueClient has nothing to do with issues.

Re: IssueClient

Has nothing to do with issues; Its more of a "comments client". Currently there does not look like there is an implementation of a client to "fetch an issue" or "fetch all issues" or "change an issue".

These are things I would expect to see in the issueclient;

Is there any support for a client for actual issues in the future?

how to use AsyncPage with a response type that is not a JSON array?

Some Github API responses will be paginated and return a JSON object like:

{
  "total_count": 50,
  "repositories: [ ... ]
}

for example: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps#list-repositories-accessible-to-the-app-installation

It seems like these cannot be represented as GithubPage<T> since the constructor requires a TypeReference<List<T>>:

GithubPage(
final GitHubClient github, final String path, final TypeReference<List<T>> typeReference) {

which would mean that if I want to add a method to e.g. GithubAppClient to list the repos accessible to a Github app installation, I'd have to return just the single JSON response (as a Java type) - which would risk only being able to return as much data as the Github API fits into the initial page (which I think maxes out at 100 items).

... or maybe I am missing something?

Checks id field type(int) not enough

I'm trying to use the checksApi, but when i try to create a checkRun I get the following error:

com.fasterxml.jackson.databind.JsonMappingException: Numeric value (6971753714) out of range of int (-2147483648 - 2147483647)

this is because the CheckRunResponse class has the id field of int type, and the response id is greater than an int. i think I should be a String or Long.

Latest Release is 0.0.18 but latest tag is 0.0.25

The latest release (shown in the sidebar on the GitHub repo page) is 0.0.18, which is not the latest available artifact.

(This confused me when I was looking for the Repository.isCollaborator method, which was after 0.0.18).

Support for Check Suite Events

Hi

In our application we are receiving events (webhook payloads) for check-suites and I couldn't find any implementation that transforms these events/payloads (at least not here ).
We subsequently want to add custom checks to these check-suites. If it's not implemented then may be I could do a PR, would that be OK.

GitDataClient.createAnnotatedTag() creates a simple tag instead of an annotated tag

This method is supposed to create an annotated tag. It creates a simple tag instead.

According to the github create a tag api docs (emphasis added)

Note that creating a tag object does not create the reference that makes a tag in Git. If you want to create an annotated tag in Git, you have to do this call to create the tag object, and then create the refs/tags/[tag] reference. If you want to create a lightweight tag, you only have to create the tag reference - this call would be unnecessary.

They fail to mention that the refs/tags/[tag] reference should be to the tag object not to the commit. If you do this with a real repository.

When I create a tag using the existin gimplementation, I get a simple tag, not an annotated one:

$ git cat-file -p valid-main-20210917T162830
tree 27793a753db63b1705269e2727292f88b8e363f5
parent ee26020ac582dbafe276a3482653657666419d55
author xxxxx 1626388655 -0600
committer xxxxx 1626388655 -0600

Fixes checkstyle from refactoring

When I fix the implementation, the git data is correct, showing an annotated tag.

$ git cat-file -p valid-main-20210917T164327
object ce43212b8b8fd2b37fbad58f5023bbef2abcf261
type commit
tag valid-main-20210917T164327
tagger xxxxxx 1631897008 +0000

Test create tag

I will submit a PR with the fix to the method and the test.

Need Some Issues

Dear Maintainers,
Hi everyone, I am new to this repository, I want to contribute to this repo, I need some Issue based on coding.
Regards,
@mdxabu

Support for GitHub Actions

Hi, I'm happy to implement support for GitHub actions if that's something you'd consider accepting.

Thanks!

No public function exists to retrieve installation id

The documentation mentions: "Then, you can scope the client for a specific Installation ID, to do the operations at the installation level"

However, there does not seem to be any public function that can retrieve the Installation ID

[Bug] Expired token unable to refresh

2021-07-29 19:44:31.615  INFO [my-bot,1efb3e9c675e3506,1efb3e9c675e3506] 1 --- [nio-8080-exec-7] c.s.github.v3.clients.GitHubClient       : Github token for installation 1234 is either expired or null. Trying to get a new one.
--
2021-07-29 19:44:31.615  INFO [my-bot,1efb3e9c675e3506,1efb3e9c675e3506] 1 --- [nio-8080-exec-7] c.s.github.v3.clients.GitHubClient       : Got JWT Token. Now getting Github access_token for installation 1234
2021-07-29 19:44:31.619 ERROR [my-bot,a1558e2c87f905cd,a1558e2c87f905cd] 1 --- [nio-8080-exec-5] c.comp.path.WebhookErrorHandler  : error processing request: (Could not generate access token for github app)
java.lang.RuntimeException: Could not generate access token for github app
...
Caused by: java.lang.Exception: Got non-2xx status 401 when getting an access token from GitHub: Unauthorized
    at com.spotify.github.v3.clients.GitHubClient.generateInstallationToken(GitHubClient.java:607) ~[github-client-0.0.25.jar:0.0.25]
    at com.spotify.github.v3.clients.GitHubClient.getInstallationToken(GitHubClient.java:581) ~[github-client-0.0.25.jar:0.0.25]
    at com.spotify.github.v3.clients.GitHubClient.getAuthorizationHeader(GitHubClient.java:560) ~[github-client-0.0.25.jar:0.0.25]

on restart of the application; everything works fine.

The Search API shouldn't require installation authentication

When I try to search for issues in repositories on which my GitHub app is installed using the SearchClient, I get an error saying that this endpoint requires installation authentication. That shouldn't be the case. When the application has access to the repositories, the search should work with AppAuth too.

Correction: Search in general shouldn't require authentication as an installation, but searching in/for private repositories should.

To verify this, I replicated the code using https://github.com/hub4j/github-api and the search works fine with AppAuth.

Question: How to cache installation tokens?

The readme says:

The client will manage the generation of JWT tokens, as well as requesting and caching the installation tokens from GitHub.

I see that there is a hash map for the installation tokens, but I couldn't figure out how to make the client object remember more than one token.

Here is what I tried to do:

  1. create a new github client instance with the private key and app id combo
  2. periodically (1 minute) Iterate through a list of repositories that are all under the same installation
    2.1. get the installation id for the repository with:
    client.createRepositoryClient(owner, repo).createGithubAppClient().getInstallation().get().id()
    2.2 use GitHubClient.scopeForInstallationId(...) to authenticate as an installation and this is where the library checks for the installation token and I see the following in the logs Github token for installation 14XXXXXX is either expired or null. Trying to get a new one. for every repository in every iteration.

After looking at the code, I'm not sure how the caching should work when the scopeForInstallationId(...) returns a new GitHubClient instance so I assume the hash map with the installation tokens will be empty.

I'm not very good with java so my assumption is I'm doing something wrong, can you give me some pointers?

Bug: Integer Overflow Error During Deserialisation


java.util.concurrent.ExecutionException: java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Numeric value (2244518288) out of range of int (-2147483648 - 2147483647)
 at [Source: (String)"{"total_count":4,"incomplete_results":false,[truncated 3276 chars]; line: 1, column: 631] (through reference chain: com.spotify.github.v3.search.ImmutableSearchIssues$Json["items"]->java.util.ArrayList[0]->com.spotify.github.v3.search.ImmutableSearchIssue$Json["id"])
	at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
	at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.