This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
mvn clean install- Default build command (installs all modules)mvn clean install -Pdev- ALWAYS use this profile for development - enables code formatting and other dev toolsmvn clean install -Pquickbuild- Skip tests and validation for faster buildsmvn test- Run all testsmvn test -Dtest=ClassName- Run specific test class
mvn clean install -pl core- Build only the core modulemvn clean install -pl core,gson- Build specific modulesmvn clean test -pl core -Dtest=FeignTest- Run specific test in specific module
- Code is automatically formatted using Google Java Format via git hooks
- License headers are enforced via maven-license-plugin
- Use
mvn validateto check formatting and license compliance
Feign is a declarative HTTP client library with a modular design:
Core Module (core/): Contains the main Feign API and implementation
Feign.java- Main factory class for creating HTTP clientsClient.java- HTTP client abstraction (default implementation + pluggable alternatives)Contract.java- Annotation processing interface (Default, JAX-RS, Spring contracts)Encoder/Decoder.java- Request/response serialization interfacesTarget.java- Represents the remote HTTP service to invokeRequestTemplate.java- Template for building HTTP requests with parameter substitutionMethodMetadata.java- Metadata about interface methods and their annotations
Integration Modules: Each module provides integration with specific libraries:
gson/,jackson/,fastjson2/- JSON serializationokhttp/,httpclient/,hc5/,java11/- HTTP client implementationsjaxrs/,jaxrs2/,jaxrs3/- JAX-RS annotation supportspring/- Spring MVC annotation supporthystrix/- Circuit breaker integrationmicrometer/,dropwizard-metrics4/5/- Metrics integration
- Builder Pattern:
Feign.builder()for configuring clients - Factory Pattern:
Feign.newInstance(Target)creates proxy instances - Strategy Pattern: Pluggable
Client,Encoder,Decoder,Contractimplementations - Template Method:
RequestTemplatefor building HTTP requests with parameter substitution - Proxy Pattern: Dynamic proxies created for interface-based clients
- Parent POM manages dependencies and common configuration
- Each integration is a separate Maven module
- Modules can be built independently:
mvn clean install -pl module-name - Example modules depend on
feign-coreand their respective 3rd party libraries
feign-corecontainsAbstractClientTestbase class for testing HTTP clients- Each module has its own test suite
- Integration tests use MockWebServer for HTTP mocking
- Tests are run with JUnit 5 and AssertJ assertions
- Google Java Format is enforced via git hooks
- Code is formatted automatically on commit
- Package-private visibility is preferred over public when possible
- 3rd party dependencies are minimized in core module
- Core module: Minimal dependencies (only what's needed for HTTP client abstraction)
- Integration modules: Add specific 3rd party libraries (Jackson, OkHttp, etc.)
- BOM (Bill of Materials) manages version consistency across modules
- Source/target: Java 8 (for
src/main) - Tests: Java 21 (for
src/test) - Maintains backwards compatibility with Java 8 in main codebase
When 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:
- Add a
<properties>section to the module'spom.xml(or update existing one) - Set
<main.java.version>to the required version (11, 17, 21, etc.)
Example:
<properties>
<main.java.version>17</main.java.version>
</properties>Common scenarios requiring Java version updates:
- Dropwizard Metrics 5.x requires Java 17
- Handlebars 4.5.0+ requires Java 17
- Jakarta EE modules typically require Java 11+
Examples of modules with custom Java versions:
spring/- Java 17 (for Spring 6.x)jaxrs4/- Java 17 (for Jakarta EE 9+)dropwizard-metrics5/- Java 17 (for Metrics 5.x)apt-test-generator/- Java 17 (for Handlebars 4.5.0+)soap-jakarta/,jaxb-jakarta/- Java 11 (for Jakarta namespace)