{"owner":"OpenFeign","repo":"feign","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\nThis file provides guidance to AI coding assistants when working with code in this repository.\n\n## Build Commands\n\n### Essential Build Commands\n- `mvn clean install` - Default build command (installs all modules)\n- `mvn clean install -Pdev` - **ALWAYS use this profile for development** - enables code formatting and other dev tools\n- `mvn clean install -Pquickbuild` - Skip tests and validation for faster builds\n- `mvn test` - Run all tests\n- `mvn test -Dtest=ClassName` - Run specific test class\n\n### Module-specific Commands\n- `mvn clean install -pl core` - Build only the core module\n- `mvn clean install -pl core,gson` - Build specific modules\n- `mvn clean test -pl core -Dtest=FeignTest` - Run specific test in specific module\n\n### Code Quality\n- Code is automatically formatted using Google Java Format via git hooks\n- License headers are enforced via maven-license-plugin\n- Use `mvn validate` to check formatting and license compliance\n\n## Project Architecture\n\n### Core Architecture\nFeign is a declarative HTTP client library with a modular design:\n\n**Core Module (`core/`)**: Contains the main Feign API and implementation\n- `Feign.java` - Main factory class for creating HTTP clients\n- `Client.java` - HTTP client abstraction (default implementation + pluggable alternatives)\n- `Contract.java` - Annotation processing interface (Default, JAX-RS, Spring contracts)\n- `Encoder/Decoder.java` - Request/response serialization interfaces\n- `Target.java` - Represents the remote HTTP service to invoke\n- `RequestTemplate.java` - Template for building HTTP requests with parameter substitution\n- `MethodMetadata.java` - Metadata about interface methods and their annotations\n\n**Integration Modules**: Each module provides integration with specific libraries:\n- `gson/`, `jackson/`, `fastjson2/` - JSON serialization\n- `okhttp/`, `httpclient/`, `hc5/`, `java11/` - HTTP client implementations  \n- `jaxrs/`, `jaxrs2/`, `jaxrs3/` - JAX-RS annotation support\n- `spring/` - Spring MVC annotation support\n- `hystrix/` - Circuit breaker integration\n- `micrometer/`, `dropwizard-metrics4/5/` - Metrics integration\n- `validation/`, `validation-jakarta/` - JSR-303 / Jakarta Bean Validation via the `MethodInterceptor` extension point\n- `http-cache/` - Conditional revalidation (`ETag` / `Last-Modified` / `304 Not Modified`) via the `MethodInterceptor` extension point\n\n### Key Design Patterns\n- **Builder Pattern**: `Feign.builder()` for configuring clients\n- **Factory Pattern**: `Feign.newInstance(Target)` creates proxy instances\n- **Strategy Pattern**: Pluggable `Client`, `Encoder`, `Decoder`, `Contract` implementations\n- **Template Method**: `RequestTemplate` for building HTTP requests with parameter substitution\n- **Proxy Pattern**: Dynamic proxies created for interface-based clients\n\n### Multi-module Maven Structure\n- Parent POM manages dependencies and common configuration\n- Each integration is a separate Maven module\n- Modules can be built independently: `mvn clean install -pl module-name`\n- Example modules depend on `feign-core` and their respective 3rd party libraries\n\n### Testing Strategy\n- `feign-core` contains `AbstractClientTest` base class for testing HTTP clients\n- Each module has its own test suite\n- Integration tests use MockWebServer for HTTP mocking\n- Tests are run with JUnit 5 and AssertJ assertions\n\n## Development Notes\n\n### Code Style\n- Google Java Format is enforced via git hooks\n- Code is formatted automatically on commit\n- Package-private visibility is preferred over public when possible\n- 3rd party dependencies are minimized in core module\n\n### Module Dependencies\n- Core module: Minimal dependencies (only what's needed for HTTP client abstraction)\n- Integration modules: Add specific 3rd party libraries (Jackson, OkHttp, etc.)\n- BOM (Bill of Materials) manages version consistency across modules\n\n### Java Version Support\n- Source/target: Java 8 (for `src/main`)\n- Tests: Java 21 (for `src/test`)\n- Maintains backwards compatibility with Java 8 in main codebase\n\n### Updating Java Version for a Module\nWhen a module's dependencies require a newer Java version (e.g., due to dependency upgrades), you need to override the Java version in that module's `pom.xml`:\n\n1. Add a `<properties>` section to the module's `pom.xml` (or update existing one)\n2. Set `<main.java.version>` to the required version (11, 17, 21, etc.)\n\nExample:\n```xml\n<properties>\n  <main.java.version>17</main.java.version>\n</properties>\n```\n\n**Common scenarios requiring Java version updates:**\n- Dropwizard Metrics 5.x requires Java 17\n- Handlebars 4.5.0+ requires Java 17\n- Jakarta EE modules typically require Java 11+\n\n**Examples of modules with custom Java versions:**\n- `spring/` - Java 17 (for Spring 6.x)\n- `jaxrs4/` - Java 17 (for Jakarta EE 9+)\n- `dropwizard-metrics5/` - Java 17 (for Metrics 5.x)\n- `apt-test-generator/` - Java 17 (for Handlebars 4.5.0+)\n- `soap-jakarta/`, `jaxb-jakarta/` - Java 11 (for Jakarta namespace)\n\n### Dependabot Configuration\n\nSome modules define the same Maven property name (e.g., `jersey.version`, `vertx.version`) at different major versions. Dependabot treats these as a single property across the reactor and tries to set them all to the same value, which breaks modules locked to a specific major.\n\n**Current split-property modules:**\n- `jersey.version`: 2.x (jaxrs2), 3.x (jaxrs3), 4.x (jaxrs4)\n- `vertx.version`: 4.x (feign-vertx4-test), 5.x (feign-vertx, feign-vertx5-test)\n\n**How it works in `.github/dependabot.yml`:**\n1. The root `/` entry **ignores** the conflicting dependencies entirely (jersey, vertx)\n2. Each module gets its own entry with `allow` (only the conflicting dependency) and `ignore` (block major version bumps)\n3. Other dependencies that use **different property names** per major (e.g., `jaxb-impl-2.version` vs `jaxb-impl-4.version`) only need `update-types: [\"version-update:semver-major\"]` on the root entry\n\n**When adding a new module that reuses a version property at a different major:**\n1. Add the dependency to the root entry's `ignore` list (fully ignored, not just major)\n2. Add a per-directory entry for the new module with `allow` for the specific dependency and `ignore` for `version-update:semver-major`\n3. Verify existing modules with the same property also have their own per-directory entries\n\n## Releasing\n\nThe release script is at `scripts/release.sh`. It handles version updates, tagging, and pushing.\n\n### Usage\n- `./scripts/release.sh` — auto-detect release version from pom (strips `-SNAPSHOT`), auto-compute next snapshot\n- `./scripts/release.sh <release-version>` — release a specific version, auto-compute next snapshot\n- `./scripts/release.sh <release-version> <next-snapshot>` — release a specific version with explicit next snapshot\n\n### Examples\n```bash\n# Standard release (pom is at 13.10-SNAPSHOT, releases 13.10, next becomes 13.11-SNAPSHOT)\n./scripts/release.sh\n\n# Patch release with custom next snapshot\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n### What the script does\n1. Sets pom versions to the release version (removes `-SNAPSHOT`)\n2. Formats license headers and commits locally (no push)\n3. Creates and pushes a git tag for the release version\n4. Sets pom versions to the next snapshot and commits/pushes\n\n### Patch releases\nWhen doing a patch release (e.g., 13.9.1 while pom is at 13.10-SNAPSHOT), pass both arguments so the next snapshot returns to the current development version:\n```bash\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n## Documentation Requirements\n\n- New modules must include a `README.md` with usage examples following the style of existing module READMEs (e.g., `jackson/README.md`, `graphql/README.md`)\n- New public functionality (annotations, contracts, encoders, decoders) must be documented in the module's `README.md`\n- README should include: Maven dependency coordinates, `Feign.builder()` configuration examples, and advanced usage if applicable\n- Update this file's Integration Modules list when adding a new module\n"},"files":{"AGENTS.md":"# AGENTS.md\n\nThis file provides guidance to AI coding assistants when working with code in this repository.\n\n## Build Commands\n\n### Essential Build Commands\n- `mvn clean install` - Default build command (installs all modules)\n- `mvn clean install -Pdev` - **ALWAYS use this profile for development** - enables code formatting and other dev tools\n- `mvn clean install -Pquickbuild` - Skip tests and validation for faster builds\n- `mvn test` - Run all tests\n- `mvn test -Dtest=ClassName` - Run specific test class\n\n### Module-specific Commands\n- `mvn clean install -pl core` - Build only the core module\n- `mvn clean install -pl core,gson` - Build specific modules\n- `mvn clean test -pl core -Dtest=FeignTest` - Run specific test in specific module\n\n### Code Quality\n- Code is automatically formatted using Google Java Format via git hooks\n- License headers are enforced via maven-license-plugin\n- Use `mvn validate` to check formatting and license compliance\n\n## Project Architecture\n\n### Core Architecture\nFeign is a declarative HTTP client library with a modular design:\n\n**Core Module (`core/`)**: Contains the main Feign API and implementation\n- `Feign.java` - Main factory class for creating HTTP clients\n- `Client.java` - HTTP client abstraction (default implementation + pluggable alternatives)\n- `Contract.java` - Annotation processing interface (Default, JAX-RS, Spring contracts)\n- `Encoder/Decoder.java` - Request/response serialization interfaces\n- `Target.java` - Represents the remote HTTP service to invoke\n- `RequestTemplate.java` - Template for building HTTP requests with parameter substitution\n- `MethodMetadata.java` - Metadata about interface methods and their annotations\n\n**Integration Modules**: Each module provides integration with specific libraries:\n- `gson/`, `jackson/`, `fastjson2/` - JSON serialization\n- `okhttp/`, `httpclient/`, `hc5/`, `java11/` - HTTP client implementations  \n- `jaxrs/`, `jaxrs2/`, `jaxrs3/` - JAX-RS annotation support\n- `spring/` - Spring MVC annotation support\n- `hystrix/` - Circuit breaker integration\n- `micrometer/`, `dropwizard-metrics4/5/` - Metrics integration\n- `validation/`, `validation-jakarta/` - JSR-303 / Jakarta Bean Validation via the `MethodInterceptor` extension point\n- `http-cache/` - Conditional revalidation (`ETag` / `Last-Modified` / `304 Not Modified`) via the `MethodInterceptor` extension point\n\n### Key Design Patterns\n- **Builder Pattern**: `Feign.builder()` for configuring clients\n- **Factory Pattern**: `Feign.newInstance(Target)` creates proxy instances\n- **Strategy Pattern**: Pluggable `Client`, `Encoder`, `Decoder`, `Contract` implementations\n- **Template Method**: `RequestTemplate` for building HTTP requests with parameter substitution\n- **Proxy Pattern**: Dynamic proxies created for interface-based clients\n\n### Multi-module Maven Structure\n- Parent POM manages dependencies and common configuration\n- Each integration is a separate Maven module\n- Modules can be built independently: `mvn clean install -pl module-name`\n- Example modules depend on `feign-core` and their respective 3rd party libraries\n\n### Testing Strategy\n- `feign-core` contains `AbstractClientTest` base class for testing HTTP clients\n- Each module has its own test suite\n- Integration tests use MockWebServer for HTTP mocking\n- Tests are run with JUnit 5 and AssertJ assertions\n\n## Development Notes\n\n### Code Style\n- Google Java Format is enforced via git hooks\n- Code is formatted automatically on commit\n- Package-private visibility is preferred over public when possible\n- 3rd party dependencies are minimized in core module\n\n### Module Dependencies\n- Core module: Minimal dependencies (only what's needed for HTTP client abstraction)\n- Integration modules: Add specific 3rd party libraries (Jackson, OkHttp, etc.)\n- BOM (Bill of Materials) manages version consistency across modules\n\n### Java Version Support\n- Source/target: Java 8 (for `src/main`)\n- Tests: Java 21 (for `src/test`)\n- Maintains backwards compatibility with Java 8 in main codebase\n\n### Updating Java Version for a Module\nWhen a module's dependencies require a newer Java version (e.g., due to dependency upgrades), you need to override the Java version in that module's `pom.xml`:\n\n1. Add a `<properties>` section to the module's `pom.xml` (or update existing one)\n2. Set `<main.java.version>` to the required version (11, 17, 21, etc.)\n\nExample:\n```xml\n<properties>\n  <main.java.version>17</main.java.version>\n</properties>\n```\n\n**Common scenarios requiring Java version updates:**\n- Dropwizard Metrics 5.x requires Java 17\n- Handlebars 4.5.0+ requires Java 17\n- Jakarta EE modules typically require Java 11+\n\n**Examples of modules with custom Java versions:**\n- `spring/` - Java 17 (for Spring 6.x)\n- `jaxrs4/` - Java 17 (for Jakarta EE 9+)\n- `dropwizard-metrics5/` - Java 17 (for Metrics 5.x)\n- `apt-test-generator/` - Java 17 (for Handlebars 4.5.0+)\n- `soap-jakarta/`, `jaxb-jakarta/` - Java 11 (for Jakarta namespace)\n\n### Dependabot Configuration\n\nSome modules define the same Maven property name (e.g., `jersey.version`, `vertx.version`) at different major versions. Dependabot treats these as a single property across the reactor and tries to set them all to the same value, which breaks modules locked to a specific major.\n\n**Current split-property modules:**\n- `jersey.version`: 2.x (jaxrs2), 3.x (jaxrs3), 4.x (jaxrs4)\n- `vertx.version`: 4.x (feign-vertx4-test), 5.x (feign-vertx, feign-vertx5-test)\n\n**How it works in `.github/dependabot.yml`:**\n1. The root `/` entry **ignores** the conflicting dependencies entirely (jersey, vertx)\n2. Each module gets its own entry with `allow` (only the conflicting dependency) and `ignore` (block major version bumps)\n3. Other dependencies that use **different property names** per major (e.g., `jaxb-impl-2.version` vs `jaxb-impl-4.version`) only need `update-types: [\"version-update:semver-major\"]` on the root entry\n\n**When adding a new module that reuses a version property at a different major:**\n1. Add the dependency to the root entry's `ignore` list (fully ignored, not just major)\n2. Add a per-directory entry for the new module with `allow` for the specific dependency and `ignore` for `version-update:semver-major`\n3. Verify existing modules with the same property also have their own per-directory entries\n\n## Releasing\n\nThe release script is at `scripts/release.sh`. It handles version updates, tagging, and pushing.\n\n### Usage\n- `./scripts/release.sh` — auto-detect release version from pom (strips `-SNAPSHOT`), auto-compute next snapshot\n- `./scripts/release.sh <release-version>` — release a specific version, auto-compute next snapshot\n- `./scripts/release.sh <release-version> <next-snapshot>` — release a specific version with explicit next snapshot\n\n### Examples\n```bash\n# Standard release (pom is at 13.10-SNAPSHOT, releases 13.10, next becomes 13.11-SNAPSHOT)\n./scripts/release.sh\n\n# Patch release with custom next snapshot\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n### What the script does\n1. Sets pom versions to the release version (removes `-SNAPSHOT`)\n2. Formats license headers and commits locally (no push)\n3. Creates and pushes a git tag for the release version\n4. Sets pom versions to the next snapshot and commits/pushes\n\n### Patch releases\nWhen doing a patch release (e.g., 13.9.1 while pom is at 13.10-SNAPSHOT), pass both arguments so the next snapshot returns to the current development version:\n```bash\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n## Documentation Requirements\n\n- New modules must include a `README.md` with usage examples following the style of existing module READMEs (e.g., `jackson/README.md`, `graphql/README.md`)\n- New public functionality (annotations, contracts, encoders, decoders) must be documented in the module's `README.md`\n- README should include: Maven dependency coordinates, `Feign.builder()` configuration examples, and advanced usage if applicable\n- Update this file's Integration Modules list when adding a new module\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nThis file provides guidance to AI coding assistants when working with code in this repository.\n\n## Build Commands\n\n### Essential Build Commands\n- `mvn clean install` - Default build command (installs all modules)\n- `mvn clean install -Pdev` - **ALWAYS use this profile for development** - enables code formatting and other dev tools\n- `mvn clean install -Pquickbuild` - Skip tests and validation for faster builds\n- `mvn test` - Run all tests\n- `mvn test -Dtest=ClassName` - Run specific test class\n\n### Module-specific Commands\n- `mvn clean install -pl core` - Build only the core module\n- `mvn clean install -pl core,gson` - Build specific modules\n- `mvn clean test -pl core -Dtest=FeignTest` - Run specific test in specific module\n\n### Code Quality\n- Code is automatically formatted using Google Java Format via git hooks\n- License headers are enforced via maven-license-plugin\n- Use `mvn validate` to check formatting and license compliance\n\n## Project Architecture\n\n### Core Architecture\nFeign is a declarative HTTP client library with a modular design:\n\n**Core Module (`core/`)**: Contains the main Feign API and implementation\n- `Feign.java` - Main factory class for creating HTTP clients\n- `Client.java` - HTTP client abstraction (default implementation + pluggable alternatives)\n- `Contract.java` - Annotation processing interface (Default, JAX-RS, Spring contracts)\n- `Encoder/Decoder.java` - Request/response serialization interfaces\n- `Target.java` - Represents the remote HTTP service to invoke\n- `RequestTemplate.java` - Template for building HTTP requests with parameter substitution\n- `MethodMetadata.java` - Metadata about interface methods and their annotations\n\n**Integration Modules**: Each module provides integration with specific libraries:\n- `gson/`, `jackson/`, `fastjson2/` - JSON serialization\n- `okhttp/`, `httpclient/`, `hc5/`, `java11/` - HTTP client implementations  \n- `jaxrs/`, `jaxrs2/`, `jaxrs3/` - JAX-RS annotation support\n- `spring/` - Spring MVC annotation support\n- `hystrix/` - Circuit breaker integration\n- `micrometer/`, `dropwizard-metrics4/5/` - Metrics integration\n- `validation/`, `validation-jakarta/` - JSR-303 / Jakarta Bean Validation via the `MethodInterceptor` extension point\n- `http-cache/` - Conditional revalidation (`ETag` / `Last-Modified` / `304 Not Modified`) via the `MethodInterceptor` extension point\n\n### Key Design Patterns\n- **Builder Pattern**: `Feign.builder()` for configuring clients\n- **Factory Pattern**: `Feign.newInstance(Target)` creates proxy instances\n- **Strategy Pattern**: Pluggable `Client`, `Encoder`, `Decoder`, `Contract` implementations\n- **Template Method**: `RequestTemplate` for building HTTP requests with parameter substitution\n- **Proxy Pattern**: Dynamic proxies created for interface-based clients\n\n### Multi-module Maven Structure\n- Parent POM manages dependencies and common configuration\n- Each integration is a separate Maven module\n- Modules can be built independently: `mvn clean install -pl module-name`\n- Example modules depend on `feign-core` and their respective 3rd party libraries\n\n### Testing Strategy\n- `feign-core` contains `AbstractClientTest` base class for testing HTTP clients\n- Each module has its own test suite\n- Integration tests use MockWebServer for HTTP mocking\n- Tests are run with JUnit 5 and AssertJ assertions\n\n## Development Notes\n\n### Code Style\n- Google Java Format is enforced via git hooks\n- Code is formatted automatically on commit\n- Package-private visibility is preferred over public when possible\n- 3rd party dependencies are minimized in core module\n\n### Module Dependencies\n- Core module: Minimal dependencies (only what's needed for HTTP client abstraction)\n- Integration modules: Add specific 3rd party libraries (Jackson, OkHttp, etc.)\n- BOM (Bill of Materials) manages version consistency across modules\n\n### Java Version Support\n- Source/target: Java 8 (for `src/main`)\n- Tests: Java 21 (for `src/test`)\n- Maintains backwards compatibility with Java 8 in main codebase\n\n### Updating Java Version for a Module\nWhen a module's dependencies require a newer Java version (e.g., due to dependency upgrades), you need to override the Java version in that module's `pom.xml`:\n\n1. Add a `<properties>` section to the module's `pom.xml` (or update existing one)\n2. Set `<main.java.version>` to the required version (11, 17, 21, etc.)\n\nExample:\n```xml\n<properties>\n  <main.java.version>17</main.java.version>\n</properties>\n```\n\n**Common scenarios requiring Java version updates:**\n- Dropwizard Metrics 5.x requires Java 17\n- Handlebars 4.5.0+ requires Java 17\n- Jakarta EE modules typically require Java 11+\n\n**Examples of modules with custom Java versions:**\n- `spring/` - Java 17 (for Spring 6.x)\n- `jaxrs4/` - Java 17 (for Jakarta EE 9+)\n- `dropwizard-metrics5/` - Java 17 (for Metrics 5.x)\n- `apt-test-generator/` - Java 17 (for Handlebars 4.5.0+)\n- `soap-jakarta/`, `jaxb-jakarta/` - Java 11 (for Jakarta namespace)\n\n### Dependabot Configuration\n\nSome modules define the same Maven property name (e.g., `jersey.version`, `vertx.version`) at different major versions. Dependabot treats these as a single property across the reactor and tries to set them all to the same value, which breaks modules locked to a specific major.\n\n**Current split-property modules:**\n- `jersey.version`: 2.x (jaxrs2), 3.x (jaxrs3), 4.x (jaxrs4)\n- `vertx.version`: 4.x (feign-vertx4-test), 5.x (feign-vertx, feign-vertx5-test)\n\n**How it works in `.github/dependabot.yml`:**\n1. The root `/` entry **ignores** the conflicting dependencies entirely (jersey, vertx)\n2. Each module gets its own entry with `allow` (only the conflicting dependency) and `ignore` (block major version bumps)\n3. Other dependencies that use **different property names** per major (e.g., `jaxb-impl-2.version` vs `jaxb-impl-4.version`) only need `update-types: [\"version-update:semver-major\"]` on the root entry\n\n**When adding a new module that reuses a version property at a different major:**\n1. Add the dependency to the root entry's `ignore` list (fully ignored, not just major)\n2. Add a per-directory entry for the new module with `allow` for the specific dependency and `ignore` for `version-update:semver-major`\n3. Verify existing modules with the same property also have their own per-directory entries\n\n## Releasing\n\nThe release script is at `scripts/release.sh`. It handles version updates, tagging, and pushing.\n\n### Usage\n- `./scripts/release.sh` — auto-detect release version from pom (strips `-SNAPSHOT`), auto-compute next snapshot\n- `./scripts/release.sh <release-version>` — release a specific version, auto-compute next snapshot\n- `./scripts/release.sh <release-version> <next-snapshot>` — release a specific version with explicit next snapshot\n\n### Examples\n```bash\n# Standard release (pom is at 13.10-SNAPSHOT, releases 13.10, next becomes 13.11-SNAPSHOT)\n./scripts/release.sh\n\n# Patch release with custom next snapshot\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n### What the script does\n1. Sets pom versions to the release version (removes `-SNAPSHOT`)\n2. Formats license headers and commits locally (no push)\n3. Creates and pushes a git tag for the release version\n4. Sets pom versions to the next snapshot and commits/pushes\n\n### Patch releases\nWhen doing a patch release (e.g., 13.9.1 while pom is at 13.10-SNAPSHOT), pass both arguments so the next snapshot returns to the current development version:\n```bash\n./scripts/release.sh 13.9.1 13.10-SNAPSHOT\n```\n\n## Documentation Requirements\n\n- New modules must include a `README.md` with usage examples following the style of existing module READMEs (e.g., `jackson/README.md`, `graphql/README.md`)\n- New public functionality (annotations, contracts, encoders, decoders) must be documented in the module's `README.md`\n- README should include: Maven dependency coordinates, `Feign.builder()` configuration examples, and advanced usage if applicable\n- Update this file's Integration Modules list when adding a new module\n","category":"root","tokens":1999}]}