views:

1920

answers:

3

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.

A: 

Check if the Maven repository support maven deploy plugin. This would be the easiest approach.

Most repositories uses ssh as the transport. See this for details.

Once it's setup, all you have to do is:

  mvn deploy:deploy
ZZ Coder
Thanks! Looks interesting. Unfortunately, my build script is in ANT. I don't suppose there's a similar plugin for ANT :)?
jqno
+10  A: 

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"/>
Rich Seller
+4  A: 

Check wagon-svn. It will allow you to 'deploy' to a Subversion repository. It's a little convoluted, but it's better than nothing. I know of a few projects that use it at java.net, and I also came across some projects using it at code.google.com.

If you want to use it, then you first need to load wagon-svn as an extension:

  <build>
    ...
    <extensions>
      <extension>
        <groupId>org.jvnet.wagon-svn</groupId>
        <artifactId>wagon-svn</artifactId>
        <version>...</version>
      </extension>
    </extensions>

Next, you need to set your deployment targets using the svn: protocol identifier. Here's an example I copied from the Internet.

<distributionManagement>
    <repository>
        <id>maven-config-processor-plugin-repo-releases</id>
        <name>Maven Repository for Config Processor Plugin (releases)</name>
        <url>svn:https://maven-config-processor-plugin.googlecode.com/svn/maven-repo/releases&lt;/url&gt;
        <uniqueVersion>false</uniqueVersion>
    </repository>
    <snapshotRepository>
        <id>maven-config-processor-plugin-repo-releases</id>
        <name>Maven Repository for Config Processor Plugin (snapshots)</name>
        <url>svn:https://maven-config-processor-plugin.googlecode.com/svn/maven-repo/snapshots&lt;/url&gt;
        <uniqueVersion>false</uniqueVersion>
    </snapshotRepository>
</distributionManagement>
Wilfred Springer
So that would automate the deploy process to SVN, following the blog post I mentioned in my question, right? I don't suppose there's something like this for ANT as well :)?
jqno
You can use Maven with wagon-svn. You don't have to create a full-blown Maven project, just create a Maven POM for deploying. So you don't use Maven for build system. Build your JAR using Ant, then deploy using `mvn deploy:deploy-file` and appropriate POM that configures wagon-svn and the "svn maven repository".
Hendy Irawan
wagon-svn configuration above is not complete, you also need to add java.net repository. For more info see: https://wagon-svn.dev.java.net/
Hendy Irawan