From 2b4f72fa9ad837212830ddf3a7392e051b7a9fbb Mon Sep 17 00:00:00 2001 From: Kabir Khan Date: Tue, 22 Jul 2025 11:49:22 +0100 Subject: [PATCH] Rework the TCK and add README --- README.md | 48 +++++++++++++++++++++++++++++++--- tck/pom.xml | 75 ++++++++++++++++++++++++++++++++++------------------- 2 files changed, 92 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 2d91449..a7c3096 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,54 @@ # A2A Java SDK for Jakarta Servers -This is the integration of the A2A Java SDK for use in Jakarta servers. +This is the integration of the [A2A Java SDK](https://github.com/a2aproject/a2a-java) for use in Jakarta servers. It is currently tested on **WildFly**, but it should be usable in other compliant Jakarta servers such as Tomcat, Jetty, and OpenLiberty. For Quarkus, use the reference implementation in the [A2A Java SDK](https://github.com/a2aproject/a2a-java) project. -It is currently tested on WildFly, but should be usable in other compliant Jakarta servers. +For more information about the A2A protocol, see [here](https://github.com/a2aproject/a2a-spec). -For more information about the A2A protocol, see [here](https://a2aproject.github.io/A2A/latest/). -And for more information about the A2A Java SDK, see [here](https://github.com/a2aproject/a2a-java). +## Getting Started +To use the A2A Java SDK in your application, you will need to package it as a `.war` file. This can be done with your standard build tool. +### Packaging your application +The key to enabling A2A in your Java application is to correctly package it. Here are the general steps you need to follow: +1. **Create a standard `.war` archive:** Your project should be configured to produce a `.war` file. This is a standard format for web applications in Java and is supported by all major runtimes. +2. **Provide implementations for `AgentExecutor` and `AgentCard`:** The A2A SDK requires you to provide your own implementations of the `AgentExecutor` and `AgentCard` interfaces. These are the core components that define the behavior of your agent. You can find more information about them in the [A2A Java SDK documentation](https://github.com/a2aproject/a2a-java). + +3. **Manage Dependencies:** Your `.war` file must contain all necessary libraries in the `/WEB-INF/lib` directory. However, some libraries may already be provided by the application server itself. + + * **Bundling Dependencies:** For libraries not provided by the server, you must bundle them inside your `.war`. + + * **Provided Dependencies:** To avoid conflicts and reduce the size of your archive, you should exclude libraries that your target runtime already provides. For example, **WildFly** includes the **Jackson** libraries, so you do not need to package them in your application. Check the documentation for your specific runtime (Tomcat, Jetty, OpenLiberty, etc.) to see which dependencies are provided. + +### Example + +The [tck/pom.xml](./tck/pom.xml) is a good example of how to package an A2A application. In this case, the application is deployed in WildFly, so the dependencies included in the `.war` are tailored to what WildFly provides. + +In this case we have the following dependencies: + +* `org.wildfly.extras.a2a:a2a-java-sdk-server-jakarta` - this is the main dependency which transitively pulls in all the dependencies from the A2A Java SDK project. + * Since some of these dependencies are provided by WildFly already, we exclude those so they do not become part of the `.war`, in order to avoid inconsistencies. +* `jakarta.ws.rs:jakarta.ws.rs-api` - this is not part of the dependencies brought in via `org.wildfly.extras.a2a:a2a-java-sdk-server-jakarta` but is needed to compile the TCK module. Since it is provided by WildFly, we make the scope `provided` so it is not included in the `.war`. +* `io.github.a2asdk:a2a-tck-server` - this is the application, which contains the `AgentExecutor` and `AgentCard` implementations for the TCK. In your case, they will most likely be implemented in the project you use to create the `.war`. + * In this case we exclude all transitive dependencies, since we are doing the main dependency management via the `org.wildfly.extras.a2a:a2a-java-sdk-server-jakarta` dependency. + +## Running the TCK + +The project includes a TCK (Technology Compatibility Kit) that you can use to test the integration with WildFly. + +To run the TCK, build the full project +```bash +mvn clean install -DskipTests +``` + +You now have a server provisioned with the `.war` deployed in the `tck/target/wildfly` folder. + +We can start the server using the following command: + +```bash +./tck/target/wildfly/bin/standalone.sh +``` +Once the server is up and running, run the TCK with the instructions in [a2aproject/a2a-tck](a2aproject/a2a-tck). Make sure you check out the correct tag of `a2aproject/a2a-tck` for the protocol version we are targeting. diff --git a/tck/pom.xml b/tck/pom.xml index 62fae4c..cee5162 100644 --- a/tck/pom.xml +++ b/tck/pom.xml @@ -18,50 +18,71 @@ Java SDK for the Agent2Agent Protocol (A2A) - SDK - Jakarta - TCK - WildFly Jar + ${project.groupId} - a2a-java-sdk-server-jakarta-wildfly + a2a-java-sdk-server-jakarta ${project.version} + - * + com.fasterxml.jackson.core + * + + + com.fasterxml.jackson.datatype * + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + jakarta.inject + jakarta.inject-api + - - io.github.a2asdk - a2a-java-sdk-spec - provided - - - io.github.a2asdk - a2a-tck-server - - - * - * - - - - - jakarta.annotation - jakarta.annotation-api - provided - - - jakarta.enterprise - jakarta.enterprise.cdi-api - provided - jakarta.ws.rs jakarta.ws.rs-api provided + + + + io.github.a2asdk + a2a-tck-server + + + + * + * + + + + org.wildfly.plugins wildfly-maven-plugin