{"id":13626736,"url":"https://github.com/jbock-java/jbock","last_synced_at":"2025-04-06T00:10:34.318Z","repository":{"id":41288791,"uuid":"88063304","full_name":"jbock-java/jbock","owner":"jbock-java","description":"Reflectionless command line parser","archived":false,"fork":false,"pushed_at":"2025-03-23T13:28:09.000Z","size":5189,"stargazers_count":88,"open_issues_count":1,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-29T23:11:15.333Z","etag":null,"topics":["annotation-processing","command-line-parser","java"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jbock-java.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","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":"2017-04-12T14:48:23.000Z","updated_at":"2025-03-23T13:28:13.000Z","dependencies_parsed_at":"2023-12-16T09:38:51.246Z","dependency_job_id":"693dd908-4d5b-40bf-96eb-7f50632f1291","html_url":"https://github.com/jbock-java/jbock","commit_stats":null,"previous_names":["h908714124/jbock"],"tags_count":149,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbock-java%2Fjbock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbock-java%2Fjbock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbock-java%2Fjbock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbock-java%2Fjbock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jbock-java","download_url":"https://codeload.github.com/jbock-java/jbock/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247415973,"owners_count":20935387,"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":["annotation-processing","command-line-parser","java"],"created_at":"2024-08-01T22:00:16.361Z","updated_at":"2025-04-06T00:10:34.293Z","avatar_url":"https://github.com/jbock-java.png","language":"Java","readme":"[![jbock-compiler](https://maven-badges.herokuapp.com/maven-central/io.github.jbock-java/jbock-compiler/badge.svg?color=grey\u0026subject=jbock-compiler)](https://maven-badges.herokuapp.com/maven-central/io.github.jbock-java/jbock-compiler)\n[![jbock](https://maven-badges.herokuapp.com/maven-central/io.github.jbock-java/jbock/badge.svg?subject=jbock)](https://maven-badges.herokuapp.com/maven-central/io.github.jbock-java/jbock)\n\njbock is a command line parser, which uses the same well-known annotation names as [JCommander](https://jcommander.org/)\nand [picocli](https://github.com/remkop/picocli).\nIt is an\n[annotation processor](https://openjdk.java.net/groups/compiler/processing-code.html)\nwhich does not use runtime reflection, but generates a custom parser at compile time instead.\n\n### Quick rundown\n\nCreate an abstract class, or alternatively a Java interface,\nand add the `@Command` annotation.\nIn this so-called *command class*, each abstract method represents a command line option or argument.\nEvery such method must have\n\n* getter signature (doesn't return `void`, takes no arguments) and\n* annotation (either `@Option`, `@Parameter` or `@VarargsParameter`).\n\nThe types `boolean`, `List` and `Optional` (including `OptionalInt`) have special meaning.\nSee example below.\n\n````java\n@Command\nabstract class DeleteCommand {\n\n  @Option(names = {\"-v\", \"--verbosity\"},\n          description = {\"A non-required, named option. The return type is optionalish.\",\n                         \"Using int or Integer would make it required.\"})\n  abstract OptionalInt verbosity();\n\n  @Parameter(\n          index = 0,\n          description = {\"A required positional parameter. Return type is not optionalish.\",\n                         \"Built-in converter is available for type Path.\"})\n  abstract Path path();\n\n  @Parameter(\n          index = 1,\n          description = \"An optional positional parameter.\")\n  abstract Optional\u003cPath\u003e anotherPath();\n\n  @VarargsParameter(\n          description = {\"A varargs parameter. There can only be one of these.\",\n                         \"Must return List.\"})\n  abstract List\u003cPath\u003e morePaths();\n  \n  @Option(names = \"--dry-run\",\n          description = \"A nullary option, a.k.a. mode flag. Must return boolean.\")\n  abstract boolean dryRun();\n  \n  @Option(names = \"-h\",\n          description = \"A repeatable option. Must return List.\")\n  abstract List\u003cString\u003e headers(); \n  \n  @Option(names = \"--charset\",\n          description = \"Named option with a custom converter\",\n          converter = CharsetConverter.class)\n  abstract Optional\u003cCharset\u003e charset();\n  \n  static class CharsetConverter extends StringConverter\u003cCharset\u003e {\n    @Override\n    protected Charset convert(String token) { return Charset.forName(token); }\n  }\n}\n````\n\nThe generated class is called `*Parser`.\n\n````java\npublic static void main(String[] args) {\n  DeleteCommand command = DeleteCommandParser.parseOrExit(args);\n  // alternatively:\n  // Either\u003cParsingFailed, DeleteCommand\u003e either = DeleteCommandParser.parse(List.of(args));\n}\n\n````\n\n### Standard types\n\nSome types don't need a custom converter. See [StandardConverters.java](https://github.com/jbock-java/jbock/blob/master/jbock/src/main/java/net/jbock/contrib/StandardConverters.java).\n\n### Subcommands\n\nThe `@SuperCommand` annotation can be used to define a git-like subcommand structure. See [javadoc](https://github.com/jbock-java/jbock/blob/master/jbock/src/main/java/net/jbock/SuperCommand.java).\n\n### Sample projects\n\n* [jbock-maven-example](https://github.com/jbock-java/jbock-maven-example)\n* [jbock-gradle-example](https://github.com/jbock-java/jbock-gradle-example)\n\n### Alternatives\n\n* [Tim's list](https://github.com/timtiemens/javacommandlineparser)\n","funding_links":[],"categories":["Projects","项目"],"sub_categories":["CLI"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbock-java%2Fjbock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjbock-java%2Fjbock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbock-java%2Fjbock/lists"}