{"id":13626752,"url":"https://github.com/joel-jeremy/externalized-properties","last_synced_at":"2026-01-11T16:54:12.224Z","repository":{"id":36984653,"uuid":"422685668","full_name":"joel-jeremy/externalized-properties","owner":"joel-jeremy","description":"A lightweight and extensible library to resolve application properties from various external sources.","archived":false,"fork":false,"pushed_at":"2024-08-23T01:49:13.000Z","size":1528,"stargazers_count":27,"open_issues_count":10,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-08T17:47:42.935Z","etag":null,"topics":["configuration","feature-flags","feature-toggles","java","jvm","properties"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joel-jeremy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://www.paypal.me/joeljeremymarquez"]}},"created_at":"2021-10-29T19:04:28.000Z","updated_at":"2024-08-18T10:28:28.000Z","dependencies_parsed_at":"2023-11-16T20:16:41.835Z","dependency_job_id":"6f4f265e-f0c8-4260-8e06-10be156716b2","html_url":"https://github.com/joel-jeremy/externalized-properties","commit_stats":null,"previous_names":["joeljeremy7/externalized-properties"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joel-jeremy%2Fexternalized-properties","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joel-jeremy%2Fexternalized-properties/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joel-jeremy%2Fexternalized-properties/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joel-jeremy%2Fexternalized-properties/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joel-jeremy","download_url":"https://codeload.github.com/joel-jeremy/externalized-properties/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249265401,"owners_count":21240572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["configuration","feature-flags","feature-toggles","java","jvm","properties"],"created_at":"2024-08-01T22:00:17.192Z","updated_at":"2026-01-11T16:54:12.219Z","avatar_url":"https://github.com/joel-jeremy.png","language":"Java","funding_links":["https://www.paypal.me/joeljeremymarquez"],"categories":["Projects","项目"],"sub_categories":["Configuration","配置"],"readme":"# Externalized Properties\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/joel-jeremy/externalized-properties/blob/main/LICENSE)\n[![Gradle Build](https://github.com/joel-jeremy/externalized-properties/actions/workflows/gradle-build.yaml/badge.svg)](https://github.com/joel-jeremy/externalized-properties/actions/workflows/gradle-build.yaml)\n[![CodeQL](https://github.com/joel-jeremy/externalized-properties/actions/workflows/codeql.yaml/badge.svg)](https://github.com/joel-jeremy/externalized-properties/actions/workflows/codeql.yaml)\n[![Maven Central](https://maven-badges.sml.io/maven-central/io.github.joel-jeremy.externalized-properties/externalized-properties-core/badge.svg)](https://maven-badges.sml.io/maven-central/io.github.joel-jeremy.externalized-properties/externalized-properties-core)\n[![Coverage Status](https://coveralls.io/repos/github/joel-jeremy/externalized-properties/badge.svg?branch=main)](https://coveralls.io/github/joel-jeremy/externalized-properties?branch=main)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=joel-jeremy_externalized-properties\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)\n[![Discord](https://img.shields.io/discord/1025648239162175578.svg?logo=discord\u0026logoColor=white\u0026logoWidth=20\u0026labelColor=7289DA\u0026label=Discord\u0026color=17cf48)](https://discord.gg/SVfahQGMmx)\n\u003c!-- Commenting out until issue gets fixed: https://github.com/snyk/cli/issues/668 --\u003e\n\u003c!-- [![Known Vulnerabilities](https://snyk.io/test/github/joel-jeremy/externalized-properties/badge.svg)](https://snyk.io/test/github/joel-jeremy/externalized-properties) --\u003e\n\nA lightweight and extensible library to resolve application properties from various external sources.\n\n## Like the project?\n\nPlease consider giving the repository a ⭐. It means a lot! Thank you :)\n\n## [Twelve Factor Methodology](https://12factor.net)\n\nExternalized Properties was inspired by the [The Twelve Factor Methodology](https://12factor.net)'s section [III. Config](https://12factor.net/config).  \n\nThe goal of this library is to make it easy for applications to implement configuration best practices by providing easy-to-use APIs as well as providing the flexibility to choose where to store their configurations/properties.\n\n## 🛠️ Installation\n\n### Gradle\n\n```groovy\nimplementation \"io.github.joel-jeremy.externalized-properties:externalized-properties-core:${version}\"\n// Optional/additional resolvers\nimplementation \"io.github.joel-jeremy.externalized-properties:externalized-properties-database:${version}\"\nimplementation \"io.github.joel-jeremy.externalized-properties:externalized-properties-git:${version}\"\n```\n\n### Maven\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.joel-jeremy.externalized-properties\u003c/groupId\u003e\n  \u003cartifactId\u003eexternalized-properties-core\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n\u003c!-- Optional/additional resolvers --\u003e\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.joel-jeremy.externalized-properties\u003c/groupId\u003e\n  \u003cartifactId\u003eexternalized-properties-database\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n  \u003cgroupId\u003eio.github.joel-jeremy.externalized-properties\u003c/groupId\u003e\n  \u003cartifactId\u003eexternalized-properties-git\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 🧩 Java 9 Module Names\n\nExternalized Properties jars are published with Automatic-Module-Name manifest attribute:\n\n- Core - `io.github.joeljeremy.externalizedproperties.core`\n- Database Resolver - `io.github.joeljeremy.externalizedproperties.database`\n- Git Resolver - `io.github.joeljeremy.externalizedproperties.git`\n\nModule authors can use above module names in their module-info.java:\n\n```java\nmodule foo.bar {\n  requires io.github.joeljeremy.externalizedproperties.core;\n  requires io.github.joeljeremy.externalizedproperties.database;\n  requires io.github.joeljeremy.externalizedproperties.git;\n}\n```\n\n## 🌟 Features\n\nExternalized Properties takes full advantage of Java's [Dynamic Proxies](https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html) ([Why Dynamic Proxies?](docs/why-dynamic-proxies.md)).\n\n### ✔️ Property Resolution\n\n- [Map Properties to (Java Dynamic Proxy) Interface Methods](docs/property-resolution.md#-map-properties-to-java-dynamic-proxy-interface-methods)\n- [Default/Fallback Values](docs/property-resolution.md#-defaultfallback-values)  \n- [Support for Property Names Known at Runtime](docs/property-resolution.md#-support-for-property-names-known-at-runtime)\n- [Support for Various Configuration File/Resource Formats](docs/property-resolution.md#-support-for-various-configuration-fileresource-formats)  \n- [Caching](docs/property-resolution.md#-caching)  \n- [Eager Loading](docs/property-resolution.md#-eager-loading)  \n- [Custom Resolvers](docs/property-resolution.md#-custom-resolvers)  \n\n### ✔️ Conversion\n\n- [Automatic Property Conversion](docs/conversion.md#-automatic-property-conversion)  \n- [Conversion to Generic Types](docs/conversion.md#-conversion-to-generic-types)  \n- [Conversion of Arbitrary Values](docs/conversion.md#-conversion-of-arbitrary-values)\n- [Custom Converters](docs/conversion.md#-custom-converters)\n\n### ✔️ Variable Expansion\n\n- [Automatic Variable Expansion in Property Names](docs/variable-expansion.md#-automatic-variable-expansion-in-property-names)  \n- [Automatic Variable Expansion in Properties](docs/variable-expansion.md#-automatic-variable-expansion-in-properties)  \n- [Variable Expansion in Arbitrary Values](docs/variable-expansion.md#-variable-expansion-in-arbitrary-values)\n\n### ✔️ Processing\n\n- [Targeted Processing of Properties](docs/processing.md#-targeted-processing-of-properties)\n- [Custom Processors](docs/processing.md#-custom-processors)\n\n### ✔️ Profiles\n\n- [Profile-Specific Configurations](docs/profiles.md#-profile-specific-configurations)\n\n### ✔️ Ordinal Components\n\n- [Ordinal Resolvers](docs/ordinal-components.md#-ordinal-resolvers)  \n- [Ordinal Converters](docs/ordinal-components.md#-ordinal-converters)\n\n## 🏎️ Quick Start\n\nProperties are mapped to proxy interface methods by using the [@ExternalizedProperty](core/src/main/java/io/github/joeljeremy/externalizedproperties/core/ExternalizedProperty.java) annotation.\n\n(For more advanced scenarios, please see the feature documentations.)\n\nGiven an interface:\n\n```java\npublic interface ApplicationProperties {\n  @ExternalizedProperty(\"java.home\")\n  String javaHome();\n\n  @ExternalizedProperty(\"encrypted.property\")\n  @Decrypt(\"MyDecryptor\")\n  String encryptedProperty();\n\n  @ExternalizedProperty(\"java.version\")\n  int javaVersion();\n}\n```\n\nWe can initialize and start resolving external configurations/properties by:\n\n```java\npublic static void main(String[] args) {\n  // 1. Configure and build the ExternalizedProperties instance.\n  ExternalizedProperties externalizedProperties = buildExternalizedProperties();\n\n  // 2. Initialize a proxy using the ExternalizedProperties.\n  ApplicationProperties props = externalizedProperties.initialize(ApplicationProperties.class);\n\n  // 3. Resolve the properties.\n  String javaHome = props.javaHome();\n  String encryptedProperty = props.encryptedProperty();\n  int javaVersion = props.javaVersion();\n}\n\nprivate static ExternalizedProperties buildExternalizedProperties() {\n  return ExternalizedProperties.builder()\n      .defaults() \n      .resolvers(...)\n      .processors(...)\n      .converters(...) \n      .build();\n}\n```\n\n## 🧪 Samples\n\nMore sample can be found here: \u003chttps://github.com/joel-jeremy/externalized-properties-samples\u003e\n\n---\n\n[![SonarQube Cloud](https://sonarcloud.io/images/project_badges/sonarcloud-light.svg)](https://sonarcloud.io/summary/new_code?id=joel-jeremy_externalized-properties)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoel-jeremy%2Fexternalized-properties","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoel-jeremy%2Fexternalized-properties","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoel-jeremy%2Fexternalized-properties/lists"}