{"id":13722010,"url":"https://github.com/jorabin/KeePassJava2","last_synced_at":"2025-05-07T14:31:04.424Z","repository":{"id":2936180,"uuid":"47929285","full_name":"jorabin/KeePassJava2","owner":"jorabin","description":"Java API for KeePass Password Databases - Read/Write 2.x (File versions 3 and 4), Read 1.x","archived":false,"fork":false,"pushed_at":"2025-03-15T13:58:38.000Z","size":2443,"stargazers_count":261,"open_issues_count":2,"forks_count":72,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-03-15T14:34:20.495Z","etag":null,"topics":["kdb","kdbx","keepass"],"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/jorabin.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"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}},"created_at":"2015-12-13T17:35:07.000Z","updated_at":"2025-03-13T22:28:34.000Z","dependencies_parsed_at":"2024-01-06T01:08:23.821Z","dependency_job_id":"606c0346-702f-449d-9432-dd065027c128","html_url":"https://github.com/jorabin/KeePassJava2","commit_stats":{"total_commits":164,"total_committers":6,"mean_commits":"27.333333333333332","dds":0.04268292682926833,"last_synced_commit":"6996158bb145b40c3ae90d491ca4ca07870e8898"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jorabin%2FKeePassJava2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jorabin%2FKeePassJava2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jorabin%2FKeePassJava2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jorabin%2FKeePassJava2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jorabin","download_url":"https://codeload.github.com/jorabin/KeePassJava2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252895550,"owners_count":21821179,"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":["kdb","kdbx","keepass"],"created_at":"2024-08-03T01:01:23.676Z","updated_at":"2025-05-07T14:31:04.408Z","avatar_url":"https://github.com/jorabin.png","language":"Java","funding_links":[],"categories":["Docs and articles","安全"],"sub_categories":["Other clients"],"readme":"# KeePassJava2\n\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.linguafranca.pwdb/KeePassJava2-parent/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.linguafranca.pwdb/KeePassJava2-parent)\n[![javadoc](https://javadoc.io/badge2/org.linguafranca.pwdb/KeePassJava2/javadoc.svg)](https://javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2)\n\n![alt text](https://badgen.net/badge/Build/2.2.4/blue?icon=github)\nmaster [![CircleCI](https://dl.circleci.com/status-badge/img/gh/jorabin/KeePassJava2/tree/master.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/gh/jorabin/KeePassJava2/tree/master)\ndevelop [![CircleCI](https://dl.circleci.com/status-badge/img/gh/jorabin/KeePassJava2/tree/develop.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/gh/jorabin/KeePassJava2/tree/develop)\n\n\n\nA Java 8 API for databases compatible with the renowned [KeePass](http://keepass.info) password\nsafe for Windows. This is a \"headless\" implementation - if you want something with a UI\nthen [KeePassXC](https://keepassxc.org/) and [KeePassDX](https://www.keepassdx.com/) could\nbe just the things for you.\n\nFeatures to date:\n\n- Read and write KeePass 2.x format (KDBX file formats V3 and V4)\n- Keepass 2.x Password and Keyfile Credentials\n- Read KeePass 1.x format (Rijndael only)\n- *No* requirement for JCE Policy Files\n- Android compatible\n- Interfaces for Database, Group and Entry allow compatible addition of other formats\n\nIt is licensed under the Apache 2 License and is currently usable.\n\n    The work is provided on an \"AS IS\" BASIS, WITHOUT\n    WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n    implied, including, without limitation, any warranties\n    or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY,\n    or FITNESS FOR A PARTICULAR PURPOSE.\n\n    You are solely responsible for determining the appropriateness\n    of using or redistributing the Work and assume any risks\n    associated with Your exercise of permissions under this License.\n\n (see [license](#license))\n\n## Current Status\n\nThe current code is version 2.2.4 - released to Maven March 2025. This is on the main branch. See [Build from Source](#build-from-source)\n\nKey updates relative to 2.1:\n- Java 8 (dependencies no longer support Java 7)\n- File format version 4 support - with Argon2\n- Inclusion of Jackson based KDBX support with a view to removing SimpleXML, JAXB and JAXB support\n- Updated keyfile support\n- Updated dependencies\n\nSee the [changelog](CHANGELOG.md) for more details.\n\n## Maven Coordinates\n\n### Release\n\nThe POM for the last release (2.2.4), Java 8 compatible, is\n\n        \u003cgroupId\u003eorg.linguafranca.pwdb\u003c/groupId\u003e\n        \u003cartifactId\u003eKeePassJava2-jackson\u003c/artifactId\u003e\n        \u003cversion\u003e2.2.4\u003c/version\u003e\n\nat Maven Central. This provides access to the Jackson based implementation, \nwhich is now the recommended implementation.  There is also a composite POM that\nprovides access to all implementations (see [below](#database-implementations) for discussion).\n\n        \u003cgroupId\u003eorg.linguafranca.pwdb\u003c/groupId\u003e\n        \u003cartifactId\u003eKeePassJava2\u003c/artifactId\u003e\n        \u003cversion\u003e2.2.4\u003c/version\u003e\n\nNote that the artifactId has become Camel Case from release 2.1.x onwards.\n\n### Snapshot\n\nSnapshot builds are erratically available at [Sonatype](https://oss.sonatype.org/content/repositories/snapshots/org/linguafranca/pwdb/), next bug-fix release will be\n2.2.5-SNAPSHOT (on branch `develop`) and work-in-progress 3.0.0-SNAPSHOT (on branch `v3`):\n\n        \u003cgroupId\u003eorg.linguafranca.pwdb\u003c/groupId\u003e\n        \u003cartifactId\u003eKeePassJava2\u003c/artifactId\u003e\n        \u003cversion\u003e2.2.5-SNAPSHOT\u003c/version\u003e\n \nwith appropriate `\u003crepositories\u003e` entry, like:\n\n      \u003crepositories\u003e\n         \u003crepository\u003e\n           \u003cid\u003eoss.sonatype.org-snapshot\u003c/id\u003e\n           \u003curl\u003ehttps://oss.sonatype.org/content/repositories/snapshots\u003c/url\u003e\n           \u003creleases\u003e\n             \u003cenabled\u003efalse\u003c/enabled\u003e\n           \u003c/releases\u003e\n           \u003csnapshots\u003e\n             \u003cenabled\u003etrue\u003c/enabled\u003e\n           \u003c/snapshots\u003e\n         \u003c/repository\u003e\n       \u003c/repositories\u003e\n \n There are also separate POMs for the various modules. The module structure is illustrated below\n under [Build from Source](#build-from-source).\n\n## Java Version\n\nFrom release 2.2 it requires Java 1.8. From release 3, Java 11. Earlier versions require Java 1.7.\n\n## Quick Start\n\nCreate credentials and an input stream for the password vault in question:\n\n      KdbxCreds creds = new KdbxCreds(\"123\".getBytes());\n      InputStream inputStream = getClass().getClassLoader().getResourceAsStream(\"test1.kdbx\");\n      \nthen choose the Jackson based database implementation, and load the database\n\n      Database database = JacksonDatabase.load(creds, inputStream)\n\nSee [below](#database-implementations) for discussion of other database implementations. Note that they will not be \nmaintained in the future - and see the following regarding making the storage of\npasswords more secure. \n\n### Storing Passwords\n\nThere are numerous well-understood problems\nwith storing passwords as Strings in Java. See [this discussion](./PropertyValueProtection.md) about the\nKeePassJava2 approach to storing passwords.\n\n\u003e Available from release 2.2.3 the enhanced **Jackson implementation** is the only KeePassJava2 database implementation that provides a\nmeans of storing passwords other than as String.  \n\n### Discussion\n\nPassword databases are modelled as a three layer abstraction. \n\nA *Database* is a collection of records whose physical representation needs only to be capable of rendering as a stream. *Entries* hold the information of value in the database and *Groups* allow the structuring of entries into collections, just like a folder structure. \n\nThe Database has a root group and by following subgroups of the root group the tree structure of the database can be navigated. Entries belong to groups. Entries can be moved between groups and groups can also be moved between groups. However, entries and groups created in one database cannot be moved to another database without being converted: \n\n    database.newEntry(entryToCopy);\n    database.newGroup(groupToCopy);\n\nThe class Javadoc on Interface classes\n[Database](http://javadoc.io/page/org.linguafranca.pwdb/database/latest/org/linguafranca/pwdb/Database.html), \n[Group](http://javadoc.io/page/org.linguafranca.pwdb/database/latest/org/linguafranca/pwdb/Group.html) and \n[Entry](http://javadoc.io/page/org.linguafranca.pwdb/database/latest/org/linguafranca/pwdb/Entry.html) describe\nhow to use the methods of those classes to create and modify entries. These classes\nprovide the basis of all implementations of the various database formats,\ninitially KDB, KDBX 3.1 and KDBX 4 (KeePass 2) file formats, subsequently, potentially, others.\n\nThe class [QuickStart.java](example/src/main/java/org/linguafranca/pwdb/kdbx/QuickStart.java) provides some\nillustrations of operations using the Database, Group and Entry interfaces.\n\n### KeePassJava2 and KeePass\n\nThis project is so named by kind permission of Dominik Reichl the author of KeePass. There\nis no formal connection with that project.\n\nIt has always been the intention to support other specific password database implementations.\nHence, the creation of abstract Database interfaces rather than following the KeePass model\nexactly.\n\nKeePass is in effect defined by the code that Dominik writes to create and maintain the project and\n[KDBX File Format Specification](https://keepass.info/help/kb/kdbx.html) describes the file format. There \nis also a discussion of the [differences between KDBX version 3.1 and version 4](https://keepass.info/help/kb/kdbx_4.html).\nAdditionally, there is a discussion of the [enhancements in KDBX 4.1](https://keepass.info/help/kb/kdbx_4.1.html), as well\nas a discussion of [Key Files](https://keepass.info/help/base/keys.html#keyfiles). \n\nMassive credit also to the folks over at [KeePassXC](https://keepassxc.org/) who wrote some \n[documentation](https://github.com/keepassxreboot/keepassxc-specs) about their understanding of various format things. Also, this is a \nuseful [discussion/investigation](https://github.com/scubajorgen/KeepassDecrypt) of the KDBX format.\n\nFor the sake of\nclarification and my own satisfaction I have written about my understanding of \nKeePass formats in the following locations:\n\n1. The Javadoc header to [KdbxSerializer](http://javadoc.io/page/org.linguafranca.pwdb/KeePassJava2-kdbx/latest/org/linguafranca/pwdb/kdbx/stream_3_1/KdbxSerializer.html) describes KDBX stream formatting.\n2. The XSD Schema [KDBX.4.xsd](KDBX.4.xsd) documents my understanding of the Keepass XML, and also my \n   lack of understanding, in parts. While preparing release 2.2.3 I found [this XSD](https://keepass.info/help/download/KDBX_XML.xsd) at the\n   KeePass site. I have not (so far) attempted to reconcile my documentation with it.\n3. The following graphic illustrates KDBX 3.1 and 4 file formats:\n\n\n[![KDBX Formats](KdbxDiagram.svg \"KDBX Formats\")](KdbxDiagram.svg)\n\n## Database Implementations\n\nKeePass - or more specifically its file format KDBX - is an XML based format, so one of the main tasks\nis serializing and deserializing XML. Over time (KeePassJava2 was originally released in 2014) approaches\nto Java and XML have been a bit mysterious. However, Jackson has now been chosen as the \nunderlying framework for implementation of KeePassJava2.\n\nThere are several other database implementations which will be maintained for bug-fix purposes\nonly, with a view to being withdrawn, since they perform badly and/or depend on obsolete technology.\n\n- `SimpleXML` - no longer maintained, does not work with Java 17 and up\n- `JAXB` - this causes problems with `javax` and `jakarta` namespaces, it's not worth maintaining\n  as it offers no compelling performance or other advantage\n- `DOM` the was the original implementation and validates the fact that DOM based implementations\n  are slow. That said, if you want to load a database and then save it while maintaining whatever quirks\n  existed in the original database then this is the one.\n\nAside from dependencies on underlying frameworks, different implementations have varying characteristics, primarily speed. This is assessed\nby [this test](https://github.com/jorabin/KeePassJava2/blob/master/example/src/main/java/org/linguafranca/pwdb/kdbx/OpenDbExample.java) in the module `examples`.\n\n## Dependencies\n\nAside from the JRE, at release 2.2, the API depends on:\n\n- [Google Guava](https://github.com/google/guava/wiki) ([Apache 2 license](https://github.com/google/guava/blob/master/COPYING)).\n- [Apache Commons Codec](https://commons.apache.org/proper/commons-codec/) ([Apache 2 license](http://www.apache.org/licenses/LICENSE-2.0)).\n- [Bouncy Castle](https://github.com/bcgit/bc-java/blob/master/LICENSE.html) ([MIT License](https://github.com/bcgit/bc-java/blob/master/LICENSE.html)).\n\nThe Jackson implementation depends on:\n\n- [Faster XML Jackson](https://github.com/FasterXML/jackson)\n\nThe (historical) Simple XML implementation additionally depends on:\n\n- [Simple XML Serialisation Framework](http://simple.sourceforge.net/) ([Apache 2 license](http://www.apache.org/licenses/LICENSE-2.0)).\n- [Faster XML Aalto](https://github.com/FasterXML/aalto-xml) ([Apache 2 license](http://www.apache.org/licenses/LICENSE-2.0.txt)).\n\nFor Java 11 and later, Jaxb implementation depends on explicit inclusion [no longer provided by JDK](https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-F640FA9D-FB66-4D85-AD2B-D931174C09A3) of:\n\n- [JAXB](https://javaee.github.io/jaxb-v2/)\n\nIt also depends on SLF4J and Junit 4 for tests.\n\n## Build from Source\n\nIncluded POM is for Maven 3.\n\n### Module Structure\n\nThere are rather a lot of modules, this is in order to allow loading of minimal necessary functionality. The module dependencies are illustrated below.\n\n[![Module Structure](ModuleStructure.svg \"Module Structure\")](./ModuleStructure.svg)\n\nEach module corresponds to a Maven artifact. The GroupId is `org.linguafranca.pwdb`. The version id is as noted [above](#maven-coordinates).\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\u003cth\u003eModule\u003c/th\u003e\u003cth\u003eArtifactId\u003c/th\u003e\u003cth\u003eJavaDoc\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"database\"\u003edatabase\u003c/a\u003e\u003c/td\u003e\u003ctd\u003edatabase\u003c/td\u003e\n\u003ctd\u003e\n\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/database\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/database.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\n\u003c/td\u003e\n\u003ctd\u003eBase definition of the Database APIs.\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"example\"\u003eexample\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eexample\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/example\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/example.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eWorked examples of loading, saving, splicing etc. using the APIs\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"test\"\u003etest\u003c/a\u003e\u003c/td\u003e\u003ctd\u003etest\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/test\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/test.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eShared tests to assess the viability of the implementation.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"all\"\u003eall\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e\u003cstrong\u003eKeePassJava2\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e(no JavaDoc)\u003c/td\u003e\n\u003ctd\u003eThis is the main KeePassJava2 Maven dependency. Provides a route to all artifacts (other than test and examples) via transitive dependency.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"kdb\"\u003ekdb\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-kdb\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-kdb\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-kdb.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eAn implementation of the Database APIs supporting KeePass KDB format.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"kdbx\"\u003ekdbx\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-kdbx\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-kdbx\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-kdbx.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eProvides support for KDBX streaming and security.\u003c/td\u003e\u003c/tr\u003e\n\n\n\u003ctr\u003e\u003ctd\u003e\u003ca href=\"jackson\"\u003ejackson\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-jackson\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-jackson\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-jackson.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA Jackson based implementation of KDBX. Intended to provide the main support going forward, replacing trhe\nmodules below.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr style=\"background-color: gray;\"\u003e\u003ctd\u003e\u003ca href=\"simple\"\u003esimple\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-simple\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-kdbx\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-kdbx.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA Simple XML Platform implementation of KDBX. Could be useful for Android.\nSimple cannot be used with Java versions 17 and up.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr style=\"background-color: gray;\"\u003e\u003ctd\u003e\u003ca href=\"jaxb\"\u003ejaxb\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-jaxb\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-jaxb\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-jaxb.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA JAXB implementation of KDBX. Probably not useful for Android. The generated class\nbindings might be useful for building other interfaces.\u003c/td\u003e\u003c/tr\u003e\n\n\u003ctr style=\"background-color: gray;\"\u003e\u003ctd\u003e\u003ca href=\"dom\"\u003edom\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKeePassJava2-dom\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://www.javadoc.io/doc/org.linguafranca.pwdb/KeePassJava2-dom\"\u003e\u003cimg src=\"https://www.javadoc.io/badge/org.linguafranca.pwdb/KeePassJava2-dom.svg\" alt=\"Javadocs\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003eA DOM based implementation of KDBX. Being DOM based it is rather slow, but \nmesses less with existing content than the other implementations. Known to work on Android.\u003c/td\u003e\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003c/table\u003e\n\nWhy are there so many implementations for KDBX? Well, the DOM implementation came first, because it can \nload and save stuff that the implementation doesn't specifically know about. But it is very slow.\n\nThen came the JAXB implementation, but \nbelatedly it seems that Android support is in question. So latterly the Simple implementation. That was probably enough \nKDBX implementations, however, the Simple XML library seems no longer to be maintained, \nand along comes the Jackson Implementation.\n\nJackson is the implementation going forward.\n\n### Gradle\n\nIf you prefer Gradle the automatic conversion `gradle init` has been known to convert the POM successfully, however you will \nneed to add something like [gradle-source-sets.txt](jaxb/gradle-source-sets.txt) to the `build.gradle` for the JAXB module, so that the generated sources\n get compiled correctly.\n\n## Change Log\n\nIn [this file](./CHANGELOG.md).\n\n## Acknowledgements\n\nMany thanks to Pavel Ivanov [@ivanovpv](https://github.com/ivanovpv) for \nhis help with Android and Gradle compatibility issues back in the very early days.\n\nThanks to Giuseppe Valente [@giusvale-dev](https://github.com/giusvale-dev) for \nhis contribution of the Jackson module and enhancements to KeyFile support.\n\nThanks to other contributors and raisers of issues.\n\n##  License\n\nCopyright (c) 2025 Jo Rabin\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjorabin%2FKeePassJava2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjorabin%2FKeePassJava2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjorabin%2FKeePassJava2/lists"}