maven repository 私人仓库怎么搭建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven repository 私人仓库怎么搭建相关的知识,希望对你有一定的参考价值。
方法:
1.基于artifactId准备路径,将artifactId连接到后面:org/testng/testng
2.使用version准备路径,将version连接到后面:org/testng/testng/5.8
3.将artifactId于version以分隔符连字号连接到后面:org/testng/testng/5.8/tesng-5.8
4.判断如果构件有classifier,就要在 第4项 后增加 分隔符连字号 再加上 classifier,org/testng/testng/5.8/tesng-5.8-jdk5
5.检查构件的extension,如果extension存在,则加上句点分隔符和extension,而extension是由packing决定的,org/testng/testng/5.8/tesng-5.8-jdk5.jar
- 6、基于groupId准备路径,将句点分隔符转成路径分隔符,就是将 "." 转换成 "/" ; example: org.testng --->org/testng
参考资料
Maven详解之仓库------本地仓库、远程仓库.研发管理[引用时间2017-12-28]
参考技术A 简单来说,共有三步:deploy到本地目录
把本地目录提交到gtihub上
配置github地址为仓库地址
配置local file maven仓库
deploy到本地
maven可以通过http, ftp, ssh等deploy到远程服务器,也可以deploy到本地文件系统里。
例如把项目deploy到/home/hengyunabc/code/maven-repo/repository/目录下:
<distributionManagement>
<repository>
<id>hengyunabc-mvn-repo</id>
<url>file:/home/hengyunabc/code/maven-repo/repository/</url>
</repository>
</distributionManagement>
通过命令行则是:
mvn deploy -DaltDeploymentRepository=hengyunabc-mvn-repo::default::file:/home/hengyunabc/code/maven-repo/repository/
推荐使用命令行来deploy,避免在项目里显式配置。
https://maven.apache.org/plugins/maven-deploy-plugin/
https://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
把本地仓库提交到github上
上面把项目deploy到本地目录home/hengyunabc/code/maven-repo/repository里,下面把这个目录提交到github上。
在Github上新建一个项目,然后把home/hengyunabc/code/maven-repo下的文件都提交到gtihub上。
cd /home/hengyunabc/code/maven-repo/
git init
git add repository/*
git commit -m 'deploy xxx'
git remote add origin git@github.com:hengyunabc/maven-repo.git
git push origin master
最终效果可以参考我的个人仓库:
https://github.com/hengyunabc/maven-repo
github maven仓库的使用
因为github使用了raw.githubusercontent.com这个域名用于raw文件下载。所以使用这个maven仓库,只要在pom.xml里增加:
<repositories>
<repository>
<id>hengyunabc-maven-repo</id>
<url>https://raw.githubusercontent.com/hengyunabc/maven-repo/master/repository</url>
</repository>
</repositories>
目录查看和搜索
值得注意的是,github因为安全原因,把raw文件下载和原来的github域名分开了,而raw.githubusercontent.com这个域名是不支持目录浏览的。所以,想要浏览文件目录,或者搜索的话,可以直接到github域名下的仓库去查看。
比如这个文件mybatis-ehcache-spring-0.0.1-20150804.095005-1.jar:
浏览器地址是:
https://github.com/hengyunabc/maven-repo/blob/master/repository/io/github/hengyunabc/mybatis-ehcache-spring/0.0.1-SNAPSHOT/mybatis-ehcache-spring-0.0.1-20150804.095005-1.jar
它的maven仓库url是:
https://raw.githubusercontent.com/hengyunabc/maven-repo/master/repository/io/github/hengyunabc/mybatis-ehcache-spring/0.0.1-SNAPSHOT/mybatis-ehcache-spring-0.0.1-20150804.095005-1.jar
maven仓库工作的机制
下面介绍一些maven仓库工作的原理。典型的一个maven依赖下会有这三个文件:
https://github.com/hengyunabc/maven-repo/tree/master/repository/io/github/hengyunabc/mybatis-ehcache-spring/0.0.1-SNAPSHOT
maven-metadata.xml
maven-metadata.xml.md5
maven-metadata.xml.sha1
maven-metadata.xml里面记录了最后deploy的版本和时间。
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
<groupId>io.github.hengyunabc</groupId>
<artifactId>mybatis-ehcache-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20150804.095005</timestamp>
<buildNumber>1</buildNumber>
</snapshot>
<lastUpdated>20150804095005</lastUpdated>
</versioning>
</metadata>
其中md5, sha1校验文件是用来保证这个meta文件的完整性。
maven在编绎项目时,会先尝试请求maven-metadata.xml,如果没有找到,则会直接尝试请求到jar文件,在下载jar文件时也会尝试下载jar的md5, sha1文件。
maven-metadata.xml文件很重要,如果没有这个文件来指明最新的jar版本,那么即使远程仓库里的jar更新了版本,本地maven编绎时用上-U参数,也不会拉取到最新的jar!
所以并不能简单地把jar包放到github上就完事了,一定要先在本地Deploy,生成maven-metadata.xml文件,并上传到github上。
参考:http://maven.apache.org/ref/3.2.2/maven-repository-metadata/repository-metadata.html
maven的仓库关系
https://maven.apache.org/repository/index.html
配置使用本地仓库
想要使用本地file仓库里,在项目的pom.xml里配置,如:
<repositories>
<repository>
<id>hengyunabc-maven-repo</id>
<url>file:/home/hengyunabc/code/maven-repo/repository/</url>
</repository>
</repositories>
注意事项
maven的repository并没有优先级的配置,也不能单独为某些依赖配置repository。所以如果项目配置了多个repository,在首次编绎时,会依次尝试下载依赖。如果没有找到,尝试下一个,整个流程会很长。
所以尽量多个依赖放同一个仓库,不要每个项目都有一个自己的仓库。
maven setting 配置仓库,pom.xml中repository不起作用
问题描述
最近做java项目,需要使用公司自己搭建的maven仓库,但是有些包公司的仓库中没有,导致下载失败。
项目环境
jdk:1.8
maven:3.5
问题原因分析
maven的setting文件配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<localRepository>/data/repository</localRepository>
<servers>
<server>
<id>releases</id>
<username>123</username>
<password>123</password>
</server>
<server>
<id>snapshots</id>
<username>123</username>
<password>123</password>
</server>
</servers>
<mirrors>
<!--注意标红的部分-->
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://server.dev.****.com:8000/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
pom.xml中的配置:
<repositories> <repository> <id>aliyun-repos</id> <url>https://maven.aliyun.com/repository/public</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>false</enabled></snapshots> </repository> <repository> <id>sonatype-repos-s</id> <name>Sonatype Repository</name> <url>https://oss.sonatype.org/content/repositories/snapshots</url> <releases><enabled>false</enabled><updatePolicy>always</updatePolicy></releases> <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots> </repository> </repositories>
我需要下载的包的仓库地址在pom文件中配置了,就是 https://oss.sonatype.org/content/repositories/snapshots,这个仓库,
但是为什么下载的时候没有起作用呢?问题就出在setting中如下部分:
<mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://server.dev.****.com:8081/nexus/content/groups/public/</url> </mirror>
mirrorof标签,这个标签如果设置为*,就说明整个工程只能使用settings中配置的地址,这个就是问题的根源。
解决办法
在settings文件的mirrorof标签中内容改成(!sonatype-repos-s,*),括号里面的内容,不包括括号,这样做的意思是,!sonatype-repos-s意思是把sonatype-repos-s这个仓库排除在外,依然把公司的仓库作为唯一仓库,这样就可以使用settings文件中配置的仓库和pom.xml配置的仓库都生效。
-------------------------------------------------------------分割线---------------------------------------------------------------
番外话:上面的问题产生的根本原因是,我们平时做项目时一般都是复制粘贴,根本不知道有些配置项什么意思,出了问题就百度,但是有时百度查不到时,还是要老老实实的从原理入手。
以上是关于maven repository 私人仓库怎么搭建的主要内容,如果未能解决你的问题,请参考以下文章