Coordinates
Choose your coordinates⚓︎
The groupId identifies your project uniquely across all projects and you control this section of the overall name-space. Similar to the Java package naming convention it reuses the domain name system in a reversed manner. This means that if you are the owner or maintainer of a domain name, you can use any groupId starting with the reverse domain name and as many subsections as you desire.
E.g., if you control example.com, you can use any groupId starting with com.example e.g. com.example.domain, com.example.testsupport and so on. Other examples are
- www.springframework.org -> org.springframework
- subdomain.example.com -> com.example
- github.com/yourusername -> io.github.yourusername
- my-domain.com -> com.my-domain (NOTE: The groupId should reverse the domain name exactly, even if the domain name contains hyphens or other characters that would result in an invalid Java package name. Hyphens are perfectly acceptable in groupIds, and you would not need to change your Java package name to match it)
Attention
You must own or control the domain as we will ask for proof of ownership by creating a TXT record in your Domain Register Service referencing your OSSRH ticket number.
If you don't own or want to use a public domain, you could use a personal domain linked to your hosting platform. See details below.
Tip
There is no need to create new tickets for new subgroups!
When we grant permissions at the top-level groupId, like io.github.example
,
you can publish any components under that groupId or any sub-groups that look
like io.github.example.mysubgroup1
or io.github.example.android
.
The same applies for owned domains, if you register com.example
you will
be able to publish any component under that groupId or any sub-group like
com.example.mysubgroup1
or com.example.sdk.android.app
.
A good way to determine the granularity of the groupId is to use the project structure. That is, if the current project is a multimodule project, it should append a new identifier to the parent's groupId - e.g., org.apache.maven, org.apache.maven.plugins, org.apache.maven.reporting.
The artifactId is the name of your project itself. You can choose whatever name you want with lowercase letters and no strange symbols. For longer names separation with dashes is common - maven-core , commons-math
Info
For version we suggest the usage of semantic version numbers to convey a meaningful number to your users and allow an understandable order of versions. However there is no specific requirement for your version number.
Supported Code Hosting services for Personal groupId⚓︎
As we know that sometimes it's difficult to manage an specific domain for a small project, we support the domains linked to personal accounts in the Code Hosting services below, so if your use them a simple verification will be asked to prove ownership:
For the user myusername
on each service
Service | Example groupId | Link to the hosting service Documentation |
---|---|---|
GitHub | io.github.myusername | https://pages.github.com/ |
GitLab | io.gitlab.myusername | https://about.gitlab.com/stages-devops-lifecycle/pages/ |
Gitee | io.gitee.myusername | https://gitee.com/help/articles/4136 |
Bitbucket | io.bitbucket.myusername | https://support.atlassian.com/bitbucket-cloud/docs/publishing-a-website-on-bitbucket-cloud/ |
SourceForge | io.sourceforge.myusername | https://sourceforge.net/p/forge/documentation/Project%20Web%20Services/ |
Attention
If you want to use a domain linked to a Hosting service we need you to prove
ownership of the account by creating a temporary, public repository with the name of the
ticket created to register the groupId. E.g. if you want to use
io.github.myusername
you must create the public repository
OSSRH-TICKETNUMBER like this github.com/myusername/OSSRH-TICKETNUMBER
.
The same applies for the other hosting services, E.g. if you want to use
io.gitee.myusername
you must create the public repository gitee.com/myusername/OSSRH-TICKETNUMBER
.
At the end of the process when your groupId is registered you can simply delete the empty repository. It is only needed during the registration phase.