{"id":21977,"date":"2024-10-11T05:23:56","date_gmt":"2024-10-11T03:23:56","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=21977"},"modified":"2024-09-29T20:26:06","modified_gmt":"2024-09-29T18:26:06","slug":"hochladen-von-java-artefakten-nach-maven-central","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=21977","title":{"rendered":"Hochladen von Java-Artefakten nach Maven Central"},"content":{"rendered":"<p>Maven Central ist das wichtigste \u00f6ffentliche Repository im Java-\u00d6kosystem und erm\u00f6glicht es Entwicklern, wiederverwendbare Komponenten einfach in ihre Projekte einzubinden. <\/p>\n<p>Das Hochladen von Java-Artefakten in das Maven Central Repository ist ein essentieller Schritt, um Java-Bibliotheken und -Anwendungen einer breiten Entwickler-Community zur Verf\u00fcgung zu stellen. Vor 8 Jahren hatte ich das schon mal <a href=\"http:\/\/blog.wenzlaff.de\/?p=7435\" rel=\"noopener\" target=\"_blank\">beschrieben<\/a>. Ein paar \u00c4nderungen gibt es inzwischen. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2024\/09\/zwei-zylinder-geo-nodes.gif\" alt=\"\" width=\"512\" height=\"288\" class=\"aligncenter size-full wp-image-21982\" \/><\/p>\n<p>Warum sollte man \u00fcberhaupt Artefakte nach Maven Central hochladen?<!--more--><\/p>\n<p><strong><br \/>\nSichtbarkeit und Zug\u00e4nglichkeit<\/strong><br \/>\nDurch die Ver\u00f6ffentlichung auf Maven Central wird Ihre Bibliothek f\u00fcr Millionen von Entwicklern weltweit zug\u00e4nglich. Das Maven Central Repository ist das Standard-Repository f\u00fcr die meisten Build-Tools in der Java-Welt, einschlie\u00dflich Maven und Gradle. Dadurch wird es f\u00fcr andere Entwickler einfacher, Ihre Bibliothek ohne zus\u00e4tzliche Konfigurationen direkt in ihre Projekte zu integrieren.<br \/>\n<strong><br \/>\nZentralisiertes Management von Abh\u00e4ngigkeiten<\/strong><br \/>\nMaven Central dient als zentraler Ort, um Abh\u00e4ngigkeiten zu verwalten. Entwickler k\u00f6nnen darauf vertrauen, dass die Bibliotheken, die sie von dort beziehen, stabil und zuverl\u00e4ssig sind. Zudem sorgt das Repository f\u00fcr die Verf\u00fcgbarkeit von Artefakten und verhindert Versionskonflikte, indem klare Richtlinien f\u00fcr Versionsnummerierung und Artefakt-Namen bestehen.<br \/>\n<strong><br \/>\nVertrauen und Reputation <\/strong><br \/>\nArtefakte, die auf Maven Central ver\u00f6ffentlicht werden, unterliegen strikten Qualit\u00e4tsanforderungen, darunter eine g\u00fcltige PGP-Signatur, saubere JavaDocs und eine klare Lizenz. Dies alles steigert das Vertrauen der Nutzer in Ihre Bibliothek. Zudem kann das regelm\u00e4\u00dfige Ver\u00f6ffentlichen hochwertiger Artefakte Ihre Reputation in der Open-Source-Community f\u00f6rdern.<\/p>\n<p><strong>Automatisierte Integration und Continuous Delivery<\/strong><br \/>\nIndem Ihre Bibliotheken zentral in Maven Central verf\u00fcgbar sind, k\u00f6nnen Sie sie nahtlos in automatisierte Build-Prozesse und Continuous Delivery Pipelines integrieren. Viele Continuous Integration (CI)-Dienste wie Jenkins, GitHub Actions oder GitLab CI greifen standardm\u00e4\u00dfig auf Maven Central zur\u00fcck, um Abh\u00e4ngigkeiten zu laden.<br \/>\n<strong><br \/>\nVoraussetzungen f\u00fcr die Ver\u00f6ffentlichung auf Maven Central<\/strong><\/p>\n<p>Bevor Sie ein Artefakt auf Maven Central hochladen, m\u00fcssen bestimmte Anforderungen erf\u00fcllt werden:<\/p>\n<p>&#8211;<strong>Maven Project Object Model (POM)<\/strong>: Ihr Projekt muss ein korrekt konfiguriertes <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/blob\/v0.0.1\/pom.xml?ref_type=tags\" rel=\"noopener\" target=\"_blank\">pom.xml<\/a> besitzen, das die Projekt-Metadaten, Abh\u00e4ngigkeiten, Entwicklerinformationen und eine Lizenz beschreibt (siehe <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/blob\/v0.0.1\/pom.xml?ref_type=tags\" rel=\"noopener\" target=\"_blank\">Beispiel<\/a>).<\/p>\n<p>&#8211;<strong>Gruppen-ID<\/strong>: Sie m\u00fcssen eine eindeutige groupId f\u00fcr Ihr Projekt festlegen. Diese sollte in der Regel Ihrer Domain entsprechen (z.B. de.wenzlaff.mathe). Falls Sie keine eigene Domain besitzen, k\u00f6nnen Sie sich \u00fcber den Dienst <a href=\"https:\/\/central.sonatype.org\/register\/legacy\/\" rel=\"noopener\" target=\"_blank\">Sonatype OSSRH<\/a> eine Gruppen-ID registrieren lassen.<\/p>\n<p>&#8211;<strong>Artefakt-ID und Versionsnumme<\/strong>: Die artifactId ist der Name des ver\u00f6ffentlichten Artefakts und sollte eindeutig sein. Zudem m\u00fcssen Sie eine sinnvolle Versionsnummer verwenden, die sich an semantischer Versionierung orientiert (z.B. 1.0.0). SNAPSHOT kann nicht hochgeladen werden.<\/p>\n<p>&#8211;<strong>PGP-Signatur<\/strong>: Maven Central erfordert, dass alle Artefakte digital signiert werden. Hierzu ben\u00f6tigen Sie einen GPG-Schl\u00fcssel, mit dem Sie die Integrit\u00e4t und Authentizit\u00e4t Ihres Artefakts garantieren k\u00f6nnen. Siehe <a href=\"http:\/\/blog.wenzlaff.de\/?p=7435\" rel=\"noopener\" target=\"_blank\">hier<\/a> mit diesem Plugin in der pom.xml:<\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n\r\n&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-gpg-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.2.6&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;sign-artifacts&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;phase&gt;verify&lt;\/phase&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;sign&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\r\n\t\t\t&lt;\/plugin&gt;<\/pre>\n<p>Und in der <strong>settings.xml<\/strong> das Passwort und den User:<\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n\r\n&lt;!-- http:\/\/maven.apache.org\/plugins\/maven-gpg-plugin\/sign-mojo.html --&gt;\r\n  &lt;profiles&gt;\r\n    &lt;profile&gt;\r\n      &lt;id&gt;ossrh&lt;\/id&gt;\r\n      &lt;activation&gt;\r\n        &lt;activeByDefault&gt;true&lt;\/activeByDefault&gt;\r\n      &lt;\/activation&gt;\r\n      &lt;properties&gt;\r\n        &lt;gpg.executable&gt;\/usr\/local\/bin\/gpg&lt;\/gpg.executable&gt;\r\n        &lt;gpg.keyname&gt;KEYNAME&lt;\/gpg.keyname&gt;\r\n        &lt;gpg.passphrase&gt;PASSWORTe&lt;\/gpg.passphrase&gt;\r\n      &lt;\/properties&gt;\r\n    &lt;\/profile&gt;\r\n  &lt;\/profiles&gt;<\/pre>\n<p>&#8211;<strong>JavaDocs und Quellen:<\/strong> F\u00fcr jedes ver\u00f6ffentlichte Artefakt m\u00fcssen die Java-Dokumentation und der Quellcode mitgeliefert werden. Dies erm\u00f6glicht es Entwicklern, Ihr Projekt besser zu verstehen und zu erweitern. Das geht mit diesen Plugins:<\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-source-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.0.1&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;attach-sources&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;jar&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\r\n\t\t\t&lt;\/plugin&gt;\r\n\t\t\t&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;maven-javadoc-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;3.3.0&lt;\/version&gt;\r\n\t\t\t\t&lt;executions&gt;\r\n\t\t\t\t\t&lt;execution&gt;\r\n\t\t\t\t\t\t&lt;id&gt;attach-javadocs&lt;\/id&gt;\r\n\t\t\t\t\t\t&lt;goals&gt;\r\n\t\t\t\t\t\t\t&lt;goal&gt;jar&lt;\/goal&gt;\r\n\t\t\t\t\t\t&lt;\/goals&gt;\r\n\t\t\t\t\t&lt;\/execution&gt;\r\n\t\t\t\t&lt;\/executions&gt;\t\t\t\r\n\t\t\t&lt;\/plugin&gt;<\/pre>\n<p>&#8211;<strong>Nexus Repository Manager Account<\/strong>: Um Artefakte auf Maven Central hochzuladen, m\u00fcssen Sie ein Konto auf Sonatype\u2019s Nexus Repository Manager erstellen und sich authentifizieren.<\/p>\n<p>Hochladen eines Artefakts nach Maven Central<\/p>\n<p>1. <strong>Erstellen Sie einen GPG-Schl\u00fcssel<\/strong><\/p>\n<p>   Zuerst ben\u00f6tigen Sie einen GPG-Schl\u00fcssel, um Ihre Artefakte zu signieren.<br \/>\n2. <strong>Erstellen oder Konfigurieren Sie Ihr Maven-Projekt<\/strong><\/p>\n<p>   Wenn Sie Ihr Maven-Projekt erstellen, achten Sie darauf, dass das pom.xml alle Metadaten wie Lizenzinformationen, Entwicklerdaten und eine passende Beschreibung enth\u00e4lt. F\u00fcgen Sie au\u00dferdem Profile f\u00fcr die Ver\u00f6ffentlichung hinzu. Die URL hat sich vor ca. 2 Jahren ge\u00e4ndert: <\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n\r\n&lt;distributionManagement&gt;\r\n\t\t&lt;snapshotRepository&gt;\r\n\t\t\t&lt;id&gt;ossrh&lt;\/id&gt;\r\n\t\t\t&lt;url&gt;https:\/\/s01.oss.sonatype.org\/content\/repositories\/snapshots&lt;\/url&gt;\r\n\t\t&lt;\/snapshotRepository&gt;\r\n\t\t&lt;repository&gt;\r\n\t\t\t&lt;id&gt;ossrh&lt;\/id&gt;\r\n\t\t\t&lt;url&gt;https:\/\/s01.oss.sonatype.org\/service\/local\/staging\/deploy\/maven2\/&lt;\/url&gt;\r\n\t\t&lt;\/repository&gt;\r\n\t&lt;\/distributionManagement&gt;<\/pre>\n<p>3. <strong>Konfigurieren Sie die POM-Datei f\u00fcr das Signieren<\/strong><\/p>\n<p>4. <strong>Erstellen Sie ein Sonatype OSSRH-Konto<\/strong><\/p>\n<p>   Melden Sie sich bei Sonatype an und erstellen Sie ein Benutzerkonto unter. Nachdem Sie die Gruppe und das Projekt eingerichtet haben, wird Ihnen Zugriff auf das Sonatype Nexus Repository gew\u00e4hrt.<\/p>\n<p>5. <strong>Artefakt-Build und Ver\u00f6ffentlichung<\/strong><\/p>\n<p>   Sie k\u00f6nnen nun das Artefakt bauen und signieren.<\/p>\n<p>   Maven wird das Artefakt signieren und auf das Nexus Repository hochladen.<\/p>\n<p>6. <strong>Releases auf Maven Central promoten<\/strong><\/p>\n<p>   Nach erfolgreichem Hochladen m\u00fcssen Sie Ihr Artefakt auf der Nexus-Weboberfl\u00e4che promoten. Hierbei pr\u00fcfen Sie, ob alle Anforderungen erf\u00fcllt sind, und geben die Ver\u00f6ffentlichung frei. Oder nutzen die autoPubish Funktion mit true, dann brauch man nicht noch auf die Webseite gehen, um das Artefakt freizugeben. <\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n&lt;plugin&gt;\r\n\t\t\t\t&lt;groupId&gt;org.sonatype.central&lt;\/groupId&gt;\r\n\t\t\t\t&lt;artifactId&gt;central-publishing-maven-plugin&lt;\/artifactId&gt;\r\n\t\t\t\t&lt;version&gt;0.6.0&lt;\/version&gt;\r\n\t\t\t\t&lt;extensions&gt;true&lt;\/extensions&gt;\r\n\t\t\t\t&lt;configuration&gt;\r\n\t\t\t\t\t&lt;publishingServerId&gt;central&lt;\/publishingServerId&gt;\r\n\t\t\t\t\t&lt;autoPublish&gt;true&lt;\/autoPublish&gt;\r\n\t\t\t\t&lt;\/configuration&gt;\r\n\t\t\t&lt;\/plugin&gt;<\/pre>\n<p>Das Ver\u00f6ffentlichen von Java-Artefakten auf Maven Central ist ein strategischer Schritt, um die Sichtbarkeit und Zug\u00e4nglichkeit Ihrer Bibliothek zu erh\u00f6hen. Es erleichtert anderen Entwicklern den Zugriff und erm\u00f6glicht eine nahtlose Integration in deren Projekte. Indem Sie den vorgegebenen Prozess durchlaufen und die erforderlichen Qualit\u00e4tsstandards einhalten, schaffen Sie Vertrauen in die Open-Source-Gemeinschaft und tragen zur Weiterentwicklung des Java-\u00d6kosystems bei. Wenn der erste Upload geklappt hat, ist jeder zuk\u00fcnftige upload gar nicht mehr so aufwendig. <\/p>\n<p>Eine Beispiel pom.xml gibt es <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/blob\/v0.0.1\/pom.xml?ref_type=tags\" rel=\"noopener\" target=\"_blank\">hier<\/a>. Das Beispielprojekt und alle anderen Artefakte gibt es auf <a href=\"https:\/\/central.sonatype.com\/search?q=Wenzlaff&#038;sort=published\" rel=\"noopener\" target=\"_blank\">Maven-Central<\/a>.<\/p>\n<p>Das Beispiel kann dann mit:<\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:xhtml decode:true \" >\r\n\r\n&lt;dependency&gt;\r\n    &lt;groupId&gt;de.wenzlaff.mathe&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;de.wenzlaff.mate&lt;\/artifactId&gt;\r\n    &lt;version&gt;0.0.1&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>eingebunden werden. Die ganze pom.xml gibt es <a href=\"https:\/\/central.sonatype.com\/artifact\/de.wenzlaff.mathe\/de.wenzlaff.mate\" rel=\"noopener\" target=\"_blank\">da<\/a> auch. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Maven Central ist das wichtigste \u00f6ffentliche Repository im Java-\u00d6kosystem und erm\u00f6glicht es Entwicklern, wiederverwendbare Komponenten einfach in ihre Projekte einzubinden. Das Hochladen von Java-Artefakten in das Maven Central Repository ist ein essentieller Schritt, um Java-Bibliotheken und -Anwendungen einer breiten Entwickler-Community zur Verf\u00fcgung zu stellen. Vor 8 Jahren hatte ich das schon mal beschrieben. Ein paar &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=21977\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eHochladen von Java-Artefakten nach Maven Central\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,3161,5,3163],"tags":[6027,6026,1174,2178,5850,66,2674,293],"class_list":["post-21977","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-build","category-java","category-maven","tag-artefakt","tag-central","tag-hochladen","tag-java","tag-mathe","tag-maven","tag-maven-central","tag-plugin"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21977","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21977"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21977\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21977"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21977"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21977"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}