转自:http://www.theserverside.com/tt/articles/article.tss?l=SettingUpMavenRepository
Maven is a popular build tool available for java developers. One of the benefits of maven is that helps to reduce the duplication of dependent software libraries (jars) required to build an application. The maven suggested approach is to store all the software libraries in a remote store called a repository.
Maven synchronizes with the public repository at ibiblio.org This repository is slow, unreliable and does not have the latest versions of some libraries(jars) available elsewhere. Libraries private to the organization cannot be uploaded there either. By setting up an internal maven repository, an organization can avail of the benefits of a maven repository and bypass some of the shortcomings of the repository at ibiblio.
This article looks at some of the functionality that a maven repository should provide. Criteria for choosing a maven repository are listed. Steps involved in setting up a maven repository using Artifactory are explained. The process of setting up the repository is same for both Linux and Windows and the minor differences are highlighted in the article. Examples of maven ‘pom’ files which use this repository are shown. The article is illustrated with screenshots to guide the user in setting up a repository. Sample maven and artifactory configuration is shown.
1.1 Background knowledge
It is assumed that the reader is familiar with the following concepts and technologies:
1.2 Purpose of maven repository
The purpose of maven repository is to serve as an internal private repository of all software libraries used within an organization. Storing maven artefacts(jars and poms) in a dedicated maven repository is preferable to storing them in version control systems(such as CVS or Subversion) for the following reasons:
1.3 Advantages of having an internal private repository:
1.4 Types of maven repository
2.1 Development environment without any repository
2.2 Development environment with an organization wide internal remote repository
The ideal maven repository implementation should be:
Some of the popular open source and free maven repositories are:
A comparison is shown below:
Standard maven repository | Dead simple Maven Proxy (DSMP) | Proximity | Artifactory | |
Admin tools | No | Basic | Yes | Yes |
Repository browser | Basic | No | Yes | Yes |
Deployable in standard web server (e.g. Tomcat or Jetty) | Yes, but not configurable | No | Yes | Yes(works in Tomcat and bundled with Jetty) |
Create, edit and delete sub repositories | Yes | Yes | Yes | Yes |
Bulk import/export artefacts | No | No | No | Yes |
Easy to setup and use | Yes | No, build from source | Yes | Yes(Ajax web UI) |
Backup facility | No | No | No | Yes(using Java quartz API and ‘cron’ expressions) |
Issue tracker, forums and other sources of information | Jira, IRC | No | Wiki and issues tracker | Jira issue tracker. Good documentation on site |
Following review of all products, Artifactory has all the criteria that we are looking for. Proximity maven repository also seems to have most of the features we are looking for. We will look at implementing the maven repository using Artifactory.
Other points about Artifactory are:
6.1 Required software
6.2 Directory structure
Down load and unzip artifactory. The directory structure is shown below:
The folders are:
6.2 Deploy in Tomcat 6
Deploy the ‘war’ file in ‘<ARTIFACTORY_INSTALLATION<wbr></wbr>_FOLDER>/webapp’ to ‘<TOMCAT_INSTALLATION_FOLDER><wbr></wbr>/webapps’. No tomcat configuration changes are required with jdk1.6 and Tomcat 6. Tomcat 6 should detect the web application and deploy it.
Once the web applications is deployed, the web application needs this information:
A single configuration is used to specify all 3. We only have to specify the location of the location of the artifactory installation folder during Tomcat startup and artifactory will be able to work out the rest. An alternative to this approach would have been to setup connection to the derby database using jdbc and to configure artifactory in the web application(by including artifactory.config.xml in the web application). However, this approach is simpler.
The location of artifactory installation folder can be specified as a environment variable. For Linux, use ‘.bash’ script to export the location of the artifactory installation folder as shown below:
export JAVA_OPTS = -Dartifactory.home=/home/amangat/artifactory-1.2.1-rc1
For Windows, it can be added to Tomcat startup options as shown below:
6.3 Setup the maven repositories
A suggested approach is to create 3 repositories(or sub repositories) in our maven repository. They are:
This is configured in the <ARTIFACTORY_INSTALLATION<wbr></wbr>_FOLDER>/etc/artifactory<wbr></wbr>.config.xml’. The configuration to setup these 3 repositories is shown below:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://artifactory.jfrog.org/xsd/1.0.0" xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.0.0 http://www.jfrog.org/xsd/artifactory-v1_0_0.xsd"> <!-- Backup every 12 hours --> <!--<backupCronExp>0 0 /12 * * ?</backupCronExp>--> <localRepositories> <localRepository> <key>private-internal-repository</key> <description>Private internal repository</description> <handleReleases>true</handleReleases> <handleSnapshots>true</handleSnapshots> </localRepository> <localRepository> <key>3rd-party</key> <description>3rd party jars added manually</description> <handleReleases>true</handleReleases> <handleSnapshots>false</handleSnapshots> </localRepository> </localRepositories> <remoteRepositories> <remoteRepository> <key>ibiblio</key> <handleReleases>true</handleReleases> <handleSnapshots>false</handleSnapshots> <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern> <url>http://repo1.maven.org/maven2</url> </remoteRepository> </remoteRepositories> </config>
Start Tomcat and navigate to http://localhost:8080/artifacto<wbr></wbr>ry
The artifactory home page is shown below:
Sign in using username ‘admin’ and password ‘password’. Click on the Browse repository link and you should be able to view the contents of the repository.
7.1 Configure maven using settings.xml
Maven uses the settings.xml file located at ‘~/.m2/settings.xml’ to get the location of maven repository. If no repository is specified, maven uses the default repository which is at ibiblio.org. The settings.xml file has to be changed to use the new repository. The settings are shown below:
<profiles> <profile> <id>dev</id> <properties> <tomcat5x.home>C:/InstalledPrograms/apache-tomcat-5.5.20</tomcat5x.home> </properties> <repositories> <repository> <id>central</id> <url>http://localhost:8080/artifactory/repo</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>snapshots</id> <url>http://localhost:8080/artifactory/repo</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://localhost:8080/artifactory/repo</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>snapshots</id> <url>http://localhost:8080/artifactory/repo</url> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories> </profile> </profiles>
7.2 Configure maven using project ‘pom.xml’
The repository settings can also be done in the project pom.xml. A simple ‘pom.xml’ is shown below:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>test</groupId> <artifactId>test</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>test</name> <url>http://maven.apache.org</url> <repositories> <repository> <id>central</id> <url>http://localhost:8080/artifactory/repo</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>snapshots</id> <url>http://localhost:8080/artifactory/repo</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://localhost:8080/artifactory/repo</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <pluginRepository> <id>snapshots</id> <url>http://localhost:8080/artifactory/repo</url> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
7.3 Building using the new maven repository
When building the maven project, all the repositories should be downloaded using the new repository. The console will show the server maven uses as shown below:
Login to the new repository using your web browser and you will see that artifactory has downloaded and cached the artifacts from ibiblio.
7.4 Installing artefacts to the repository
Artifacts can be installed using the web UI or using maven command line. Installation using the web UI is simple and faster and does not require any configuration changes. Installation using the command line requires configuration changes in settings.xml and the it can be used in other scripts.
7.4.1 Installing artifacts using the web UI
The steps involved are shown below:
7.4.1 Installing artifacts from maven command line
When using ‘mvn clean install’ command, maven only packages and installs the artifact to the local repository. To install it to the AHP internal repository, we have to add an additional configuration section in the settings.xml. The steps involved are shown below:
<settings> <servers> <server> <id>organisation-internal</id> <username>admin</username> <password>password</password> </server> </servers> </settings>
To install an artefact to internal maven repository, the command is:
mvn deploy:deploy-file -DrepositoryId=organisation-internal -Durl=http://localhost:8080/artifactory/private-internal-repository -DgroupId=test -DartifactId=test -Dversion=1.1 -Dpackaging=jar -Dfile=target/test-1.1.jar
The repository id should match the server id defined in the settings.xml. The url should include the name of the repository the artefact is to be installed in.
The new artifact appears in the repository and artifactory has created the ‘pom’ file for us automatically.
8.1 Backup the repository
Backup policy is specified in the <ARTIFACTORY_INSTALLATION<wbr></wbr>_FOLDER>/etc/artifactory<wbr></wbr>.config.xml. Backup schedule is specified using ‘cron’ expression. The backup configuration element is highlighted below:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://artifactory.jfrog.org/xsd/1.0.0" xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.0.0 http://www.jfrog.org/xsd/artifactory-v1_0_0.xsd"> <!-- Backup every 12 hours --> <backupCronExp>0 0 /12 * * ?</backupCronExp> <localRepositories> <localRepository> <key>private-internal-repository</key> <description>Private internal repository</description> <handleReleases>true</handleReleases> <handleSnapshots>true</handleSnapshots> </localRepository> <localRepository> <key>3rd-party</key> <description>3rd party jars added manually</description> <handleReleases>true</handleReleases> <handleSnapshots>false</handleSnapshots> </localRepository> </localRepositories> <remoteRepositories> <remoteRepository> <key>ibiblio</key> <handleReleases>true</handleReleases> <handleSnapshots>false</handleSnapshots> <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern> <url>http://repo1.maven.org/maven2</url> </remoteRepository> </remoteRepositories> </config>
Backups are stored in ‘<ARTIFACTORY_INSTALLATION<wbr></wbr>_FOLDER>/backups’. The backups are in the same format as the local repository on developers machine. This makes it very easy to migrate the repository contents to another implementation of maven repository.
8.2 Other features
An internal private maven repository speeds up the build process and makes it easier to do clean builds. It also helps to avoid conflicts due to different versions of libraries.
Amongst the 4 common maven repositories available, Artifactory seems to be the better product.
Artifactory makes it easy to setup a maven repository. It provides all the features which a good maven repository should implement. The organization will not be locked into this tool as it is easy to migrate the repository contents to another implementation. A web UI makes the repository easy to use even for people who don’t know how the repository works.
Avneet Mangat has 5 years experience in Java/J2EE, and is currently working as Lead developer at Active Health Partners (www.ahp.co.uk). He has a Bachelor’s degree in Software Engineering, and is a Sun Certified Java programmer, Adobe certified Flash Designer and Prince2 certified (foundation). He is the lead developer of open source tool DBBrowser, please see http://databasebrowser.sourcefo<wbr></wbr>rge.net/ . His outside interests include photography and traveling, and he can be contacted at [email protected] or [email protected].