Maven repository for Google Code project

google-codemaven-2

I'm hosting a small open source project on Google Code, and I have been asked to submit the jar to a publicly accessible Maven repository. I have almost no practical knowledge of Maven. What would be the best way to do this?

Is there some central repository that I can submit to, or can I host my own? What would I need to do when I want to release a new version of the jar?

I've been Googling and found this, which looks nice and simple, but it seems a bit … contrary to the spirit of Maven, to commit jar files to SVN :).

Also, would there be a way to still keep track of the download count, as Google Code does?

EDIT

I've been getting some answers, some of which containing hints on what to add to my pom.xml. Thanks guys! But obviously I forgot to mention one important thing: my build script is in ANT, and to put it bluntly, I intend to keep it that way :). I just want to make it easier for Maven users to include my jar in their projects.

The solution I went with in the end

In the end, I did use the solution I referenced before, where I simply commit a Maven repo to SVN. I have the ANT script call Maven to set up the local repo, and then call SVN to commit it to Google Code. For those interested: look at my build script here, in the publish-maven target.

Best Answer

There is a guide to the central repository that has a section on uploading projects that may help. If nothing else you can check the naming conventions and minimal information requirements against your project.

Sonatype also do OSS Repository hosting, see their guide for details.

Update: I'm not saying you should change your build process - if Ant works for you stick with it. It's worth following the Maven conventions in your POM regardless of your build method. As the point of putting your jar in a Maven repository is to make it accessible to Maven users, you will therefore need to define a POM for your published artifact. Following the naming conventions will help your users so you might as well do it. For example adding the SCM details to the pom will (amongst other things) allow your users to import the project into their workspace using the IDE integrations for Maven.

Basically, you have 4 options:

  1. Perform a standard Maven build against a Maven repository (already ruled out)
  2. Set up a Maven repository, do your builds with Ant, and use Maven to deploy the jar and POM.
  3. Set up a Maven repository, ad use an Ant HTTP task to publish the artifacts
  4. Use a Subversion "repository", and use the SvnAnt task to publish the artifacts

Option 1

Use Maven to build and deploy the artifacts (see the Maven book and the above links for details).


Option 2

Assuming you have a build process that creates your jar, and you've defined the POM, your best bet is to publish it to the Sonatype OSS repository as above.

Deploying an existing jar to a standard Maven repository is simple with the Maven deploy plugin's deploy-file goal:

  1. Set up your repository (e.g on the Sonatype servers by raising a Jira request)
  2. Build your jar with Ant.
  3. If you have defined a POM, put it in the same directory as the jar.
  4. Run the deploy-file goal:

    mvn deploy:deploy-file -Durl=http://path/to/your/repository\ -DrepositoryId=some.id \ -Dfile=path-to-your-artifact-jar \ -DpomFile=path-to-your-pom.xml

Note that the Maven deploy goal will automatically translate the pom.xml to [project-name]-[version].pom. If you are doing either of the other two alternatives, you will need to ensure you commit the POM with the final name, i.e. [project-name]-[version].pom. You'll also need to ensure you compose the relative paths for the artifacts following the Maven conventions.

E.g. for groupId=com.foo.bar, artifactId=my-project version=1.0.0, the path to the files will be:

/com/foo/bar/my-project/my-project-1.0.0.jar
/com/foo/bar/my-project/my-project-1.0.0.pom

Option 3

If you want to use Ant to deploy to a Maven repository, you can use an Ant HTTP library (Note I've not tried this myself) . You would compose two HTTP put tasks, one for the jar and one for the POM.

<httpput url="http://path/to/your/repository" putFile="/path/to/yourproject.pom">
  <userCredentials username="user" password="password"/>
</httpput>
<httpput url="http://path/to/your/repository" putFile="/path/to/yourproject.jar">
  <userCredentials username="user" password="password"/>
</httpput>

Option 4

If you want to avoid Maven completely and use Ant to deploy to an SVN-backed repository, you can use the SvnAnt Subversion library. you would simply need to do configure the Svn import task to add your artifacts to the Remote Subversion repository.

<import path ="/dir/containing/the/jar/and/pom" 
    url="svn://your/svn/repository"
    message="release"/>