经过这两天的研究,对比Sonatype Nexus 和 Apache Archiva,觉得Apache Archiva还不错,配置简单,好用。
以下是配置Apache Archiva的具体步骤
Apache Archiva有两种模式,独立的Repository Server和依附于App Server的war文件。
下面分别介绍
1. Standalone安装模式(WindowXP,其他操作系统同理)
1) 首先到archiva主页上下载最新版1.3.2 Standanlone
http://archiva.apache.org/download.html
2) 下载后解压,在我的机器上解压后的目录是G:/apache-archiva-1.3.2
3) 配置jdk
官方主页上支持jdk1.4,但是我直接用jdk1.6了。设置环境变量JAVA_HOME(保险起见先设置上,有兴趣的朋友可以看看不设置是否可以)
4) 启动服务
进入G:/apache-archiva-1.3.2/bin
WinXP下,启动服务前必须要把archiva加入到系统服务才可以,如下
G:/apache-archiva-1.3.2/bin>archiva.bat install
wrapper | Apache Archiva installed.
如上输出结果表示加入成功。
启动Archiva Repository Server
G:/apache-archiva-1.3.2/bin>archiva.bat start
wrapper | Starting the Apache Archiva service...
wrapper | Apache Archiva started.
如上输出表示启动成功。
5) 第一次访问
在浏览器上输入
http://localhost:8080/archiva
进入到GUI界面,第一次需要输入用户名,密码,然后点击创建。
6)默认的Repository
登入后,左侧Administration栏列出了所有常用配置。
点击Reposoitory会看到archiva自带的默认internal repository 和 remote repository
internal repository表示Archive本地的repository,remote repository代表远程的repository。
当maven连接到Archiva的internal repository时,Archiva会先从本地寻找目标,找不到的话再从remote repository上继续寻找。
7) 配置文件结构
以下是几个常用的配置文件目录
%ARCHIVA_HOME%/data 数据文件根目录
%ARCHIVA_HOME%/data/database 里配置了数据库文件,包括用户数据库和系统数据库
%ARCHIVA_HOME%/data/repositories 包含索引信息。如果上传了jar等文件的话,也会保存在这里。
%ARCHIVA_HOME%/logs 存放log文件。
2. WAR安装模式(WinXP,tomcat6.x)
1) 首先到archiva主页,在历史版本里下载版1.3版的war文件。
由于1.3.2的war包含有对security的更新,访问时会导致错误
java.lang.RuntimeException: Failed referrer security check: Request did not come from the same server. Detected HTTP Referer header is 'http://localhost:8080/archiva/index.action'.
at org.codehaus.plexus.redback.struts2.interceptor.SecureActionInterceptor.executeReferrerSecurityCheck(SecureActionInterceptor.java:234)
这个问题现在还没有解决(懒得去JIRA上提)
2) 添加war文件
在tomcat根目录下创建文件夹archiva,把war名字改成archiva.war并且拷贝到刚刚创建的archiva目录下
3) 添加tomcat配置文件
创建文件 <Tomcat_Home>/conf/Catalina/localhost/archiva.xml,并且写入以下内容
<Context path="/archiva" docBase="${catalina.home}/archiva/archiva.war">
<Resource name="jdbc/users" auth="Container" type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:/path/to/database/users;create=true" />
<Resource name="jdbc/archiva" auth="Container" type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:/path/to/database/archiva;create=true" />
<Resource name="mail/Session" auth="Container"
type="javax.mail.Session"
mail.smtp.host="localhost"/>
</Context>
注意,由于我使用的是tomcat6.x,所以一定要把xml头 <?xml version="1.0" encoding="UTF-8"?>去掉。
把上边蓝色的部分改成你的本地路径,比如G:/archiva_repository/database/archiva 和G:/archiva_repository/database/user
Archiva将会自动新建两个目录分别名为archiva和user,并且自动创建DB文件,这点很省心。但是要注意一定要用两个独立的目录,不然文件就乱了。
4) 拷贝运行时需要的jar到tomcat的lib目录下
derby-10.1.3.1.jar(或更高版本), activation-1.1.jar mail-1.4.jar 和
5) 更改catalina.bat文件
加入参数
set CATALINA_OPTS=-Dappserver.home=%CATALINA_HOME% -Dappserver.base=%CATALINA_HOME%
注意一定要写在正确的位置。
我为了方便,加在最后了
这是我的文件
:doneSetArgs
set CATALINA_OPTS=-Dappserver.home=%CATALINA_HOME% -Dappserver.base=%CATALINA_HOME%
rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
goto end
:end
设置参数CATALINA_OPTS时,等号后边一定不能有双引号。
6) 启动tomcat
地址栏输入http://localhost:8080/archiva
以后的步骤同standalone模式。
注意,在war模式下,默认的data目录在tomcat根目录下,log文件保存在tomat的log目录下。
可以登陆到管理GUI界面上更改每个repository的data目录。
war模式下会在~/m2目录下自动建立一个配置文件archiva.xml
3. 配置Maven连接Apache Archive Repository Server 1) 在archive上增加项目的repository
a) 登陆Archive的GUI管理界面,左侧点击Repositories,右侧会列出可用的repository列表。
internal表示仅下载release的jar文件
b) 点击右上角“Add”,输入repository内容
ID: repository的名字,比如 lee
Name: repository描述性的名字,如 My Managed Internal Repository
Directory: 索引和上传的jar文件所在目录,如 G:/apache-archiva-1.3.2/data/repositories/lee-internal
其余默认即可,点击Update Repository按钮。
可以看到repository列表中增加了一项。
2) 增加本地的connector
connector用来作为连接的接入点,可以包括很多repository的地址,或者当上传jar文件时,作为本地缓存使用。
a) 点击左边的Proxy Connector,
b) 右侧点击 Add
Managed Repository选择刚刚创建的repository,如 lee
其余默认即可。
这样,就把远程的repository地址加入到刚刚创建的名称为lee的repository中了。
3) 增加Repository Group
Repository Group是作为一个虚拟的连接点来使用,可以在maven中作为镜像地址。
a) 在右上角Identifier里填写组的名字后,点击Add Group
b) 增加后,可以看到多了刚刚加的组。
在下边的下拉框中选择刚刚创建的repository lee
lee表示从本地名称为lee的repository里下载文件
如果需要使用代理,需要编辑lee repository,为它们添加代理。
4) 上传jar文件
a) 左侧Upload Artifact
b) 在右侧填写group id, artifact id, 等信息。repository选择新建的lee
比如填写如下
Group Id: org.lee
Artifact Id: apache
Version: 2.5
Package: jar
上传后,会在data目录下找到上传的文件。
5) 配置Maven连接的repository
虽然可以直接修改pom.xml文件来更改repository 地址,但是可重用性并不好。
建议修改~/.m2目录下的settings.xml文件
只要建立一个镜像就可以了,如下
<mirrors>
<mirror>
<id>archiva</id>
<mirrorOf>*</mirrorOf>
<url>http://127.0.0.1:8080/archiva/repository/myGroup/</url>
</mirror>
</mirrors>
6) 测试镜像
a) 建立测试类
package org.lee;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* Hello world!
*
*/
public class App {
private String info="My Local Test";
public static void main( String[] args ) {
App app = new App();
System.out.println( app.toString() );
}
@Override
public String toString() {
return new ReflectionToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).toString();
}
}
在pom.xml中增加依赖
<dependency>
<groupId>org.lee</groupId>
<artifactId>apache</artifactId>
<version>2.5</version>
</dependency>
在工程目录下运行maven命令
G:/Code/Java/LocalMavenTest/LocalMavenTest>mvn package
第一次运行会下载很多插件,都是同过镜像地址来下载,比如最后几行
.............
Downloaded: http://127.0.0.1:8080/archiva/repository/myGroup/org/codehaus/plexus/plexus-io/1.0/plexus-io-1.0.jar (0 B at 0.0 KB/sec)
Downloaded: http://127.0.0.1:8080/archiva/repository/myGroup/commons-lang/commons-lang/2.1/commons-lang-2.1.jar (0 B at 0.0 KB/sec)
[INFO] Building jar: G:/Code/Java/LocalMavenTest/LocalMavenTest/target/LocalMavenTest-0.0.1-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 39.672s
[INFO] Finished at: Tue Dec 14 17:50:41 CST 2010
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------
成功
如果想使用maven远程的commons-lang包,可以把依赖改成
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
补充:
对于公司内网,使用代理的情况,如果出现Access Denied错误,编辑Guest Role
User Roles -> Guest
找到User defined with the current role下的连接Guest(guest -)并点击
点击Edit Roles连接,在接下来的页面上给相关的repository赋权限,赋予Repository Observer即可。