1 Maven仓库的搭建

Maven仓库的搭建

1. 仓库选型

这里经过了解,好像没有什么其他的选择,Nexus就是一个不二之选,网上的帖子区别也就是在于是nexus2还是nexus3,这里鉴于nexus3的颜值较好,就选择了nexus3。

两者一个有趣的区别在于,文件的存储方式不同,nexus2对上传的文件直接存放的是源文件,而nexus3则是存放的blob文件,以一种二进制的大对象将数据存储了起来。这就导致,在2上可以直接将maven仓库C&V过去,但是在3上没法这么干。

首先下载nexus安装包:

tar -zxvf nexus-3.*.tar.gz
## 之后进入nexus-3.28.0-01/bin📂
./nexus start
## 启动后默认端口为8081
## 用户admin,密码需要在sonatype-work中获取
## 当然,启动端口可以进行修改,在sonatype-work/nexus3/etc中找到相应的配置文件进行修改,之后重启

2. 进行仓库配置

首先,nexus仓库中有三种类型,为hosted,proxy和group,下面对三种分别描述:

  • hosted :主机模式,相当于使用本地的maven仓库
  • proxy :代理模式,可以设定一个在线仓库进行Jar包的下载更新,更新之后的Jar包会存储在本地Maven仓库,hosted仓库中可以检索到
  • group :组合模式,可以把设定的仓库repositories进行组合,统一提供服务。

这里可以将maven-central设置如下:

查看maven-public提供服务的路径

之后就可以像使用阿里的maven镜像一样设置好settings.xml中的mirrors,或者修改repository的设置:

 <repositories>
        <repository>
            <id>nexus</id>
            <layout>default</layout>
            <url>http://localhost:30203/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

settings.xml文件的完整描述

详见: Setting.xml文件详解

上面有一个概念比较有意思,一个是mirror,一个是repository,一个叫镜像,一个叫仓库,都是为用户下载jar包而指定的,两者有什么差别呢?

简言之[1],mirror就是repository的一个镜像,相当于在用户和仓库之间做了个转发,将用户对A仓库的请求,转发到对B镜像仓库的请求上。


POM文件的完整描述

详见:POM文件详述

目前可以关注一下distributionManagement,因为后面向nexus仓库中上传当前项目的Jar包时,需要指定该属性

3. Maven中的几种命令的意义[2]

其中涉及到了Maven的生命周期和一个常用的插件maven-dependency-plugin。

3.1 Maven的生命周期【TODO】

3.2 上传项目生成的Jar包

这里主要用到了mvn deploy的命令,需要预先设定好POM中的distributionManagement,其中的id应该与setting文件中的<server/>节点做好对应,方便进行用户&密码的读取。

<distributionManagement>
    <!-- 部署项目产生的构件到远程仓库需要的信息 -->
    <repository>
        <!-- 是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?参见
                 repositories/repository元素 -->
        <uniqueVersion />
        <id> banseon-maven2 </id>
        <name> banseon maven2 </name>
        <url> file://${basedir}/target/deploy
        </url>
        <layout></layout>
    </repository>
    <!-- 构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见
             distributionManagement/repository元素 -->
    <snapshotRepository>
        <uniqueVersion />
        <id> banseon-maven2 </id>
        <name> Banseon-maven2 Snapshot Repository
        </name>
        <url> scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
        </url>
        <layout></layout>
    </snapshotRepository>
</distributionManagement>

之后运行mvn deploy即可

idea中出现如下日志,即为上传成功

之后查看nexus,成功在snasnapshot库中加入该jar包

2. docker仓库的搭建

1. 仓库的选型

仓库无外乎就是docker中官方推荐的registry和Harbor,Nexus。网上有人沉迷于Harbor方便的给镜像分包归置的功能,但是又希望融合在线镜像,所以选择了Nexus代理在线镜像。比较冗余了,个人认为直接选Nexus就可以满足一般的需求,这里还是选择Nexus。

2. 仓库的配置

与maven仓库类似,创建proxy类型的docker仓库代理阿里上的docker镜像,同时创建hosted类型的docker仓库用于存储下载或者上传的docker镜像,之后创建group类型,用于统一管理proxy和hosted两种仓库。

这里设置releases的端口和pulic的端口,分别作为上传和下载的端口。

之后需要进行安全设置

【另可参见】:docker下的nexus搭建[3]

3. 上传本地docker中的images

以上传java:8的镜像为例,

步骤如下:

graph LR 
id1(修改images的Tag)-->id2(docker push)
id2-->id3{是否上传成功}
id3--成功-->id4[end]
id3-.失败.->id5((圆形))
id5-->id6(进行登录后上传)

之后可以在Nexus中看到该镜像

为了验证pulic可以为外部提供镜像下载的功能,这里将镜像仓库地址配置到docker的daemon.json中。

docker pull 127.0.0.1:30205/java:8
# 可以正常下载

4. 制作项目的docker镜像

这里有两种方式:

graph LR
已有项目-->id1(打包package)
subgraph 打包
id1-->打成jar包-->制作基于jre的Dockerfile-->id2
id1-->打成war包-->制作基于tomcat的Dockerfile-->id2
id2(手动生成镜像)
end
subgraph 通过插件
id1-->借助docker-maven-plugin-->在package之后自动封装镜像
end

这里采用插件的方案:

1.在pom中定义image

首先在父pom中引入该插件, 之后在其中进行配置,主要需要配置docker的连接和相关的证书,以及dockerhub的连接和相关用户密码。

 <profiles>
        <profile>
            <id>build-jar-docker</id>
            <activation>
                <!--   这里默认构建-->
                <!--   <activeByDefault>true</activeByDefault>-->
                <!--    当pom中包含这个键值对时启用该配置-->
                <property>
                    <name>build.method</name>
                    <value>jar-docker</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>2.4.1</version>
                    </plugin>
                    <plugin>
                        <groupId>com.spotify</groupId>
                        <artifactId>docker-maven-plugin</artifactId>
                        <version>1.1.0</version>
                        <!--相关的配置-->
                        <configuration>
                            <!--构建的镜像的名字-->
                            <imageName>${project.artifactId}</imageName>
                            <imageTags>
                                <!--构建的镜像的tag,可以设置多个, 但是push的时候,会有一些报错,建议设置一个-->
                                <imageTag>${project.version}</imageTag>
                            </imageTags>
                            <!--使用的基础镜像,类似于FROM ...-->
                            <baseImage>java:8-jre-alpine</baseImage>
                            <!--docker的地址和相关证书-->
                            <dockerHost>${docker.host}</dockerHost>
                            <dockerCertPath>E:\\Docker\\Docker\\ca</dockerCertPath>
                            <resources>
                                <resource>
                                    <!--放在容器的位置-->
                                    <targetPath>/</targetPath>
                                    <!--需要移动的资源的位置-->
                                    <directory>${project.build.directory}</directory>
                                    <include>${project.build.finalName}.jar</include>
                                </resource>
                            </resources>
                            <!--运行容器时,启动jar包-->
                            <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                            <!--是否强制覆盖tag-->
                            <forceTags>true</forceTags>
                            <!--调用setting中设定好的server中的用户密码-->
                            <serverId>nexus</serverId>
                            <!--dockerHub的位置,注意不要带http://,否则push会报错-->
                            <registryUrl>${dockerhub.host}</registryUrl>
                        </configuration>
                        <executions>
                            <execution>
                                <id>build-image</id>
                                <!--对应maven中的一个生命阶段-->
                                <phase>package</phase>
                                <!--对应docker中的操作-->
                                <goals>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>tag-image</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>tag</goal>
                                </goals>
                                <configuration>
                                    <image>${project.artifactId}:${project.version}</image>
                                    <newName>${dockerhub.host}/${project.artifactId}:${project.version}</newName>
                                </configuration>
                            </execution>
                            <execution>
                                <id>push-image</id>
                                <phase>deploy</phase>
                                <goals>
                                    <goal>push</goal>
                                </goals>
                                <configuration>
                                    <imageName>${dockerhub.host}/${project.artifactId}:${project.version}</imageName>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

在子pom中通过属性进行启用

<properties>
     <build.method>jar-docker</build.method>
</properties>

2. 在Dockerfile中定义image👍

其实还可以通过在目录下定义Dockerfile来个性化的定制。

<profile>
            <id>build-jar-dockerfile</id>
            <activation>
                <!--   这里默认构建-->
                <!--   <activeByDefault>true</activeByDefault>-->
                <!--    当pom中包含这个键值对时启用该配置-->
<!--                <property>-->
<!--                    <name>build.method</name>-->
<!--                    <value>jdk-dockerfile</value>-->
<!--                </property>-->
                <!--这里通过判断是否存在这个文件来决定是否启用-->
                <file>
                    <exists>Dockerfile</exists>
                </file>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <version>2.4.1</version>
                    </plugin>
                    <plugin>
                        <groupId>com.spotify</groupId>
                        <artifactId>docker-maven-plugin</artifactId>
                        <version>1.1.0</version>
                        <!--相关的配置-->
                        <configuration>
                            <!--构建的镜像的名字-->
                            <imageName>${project.artifactId}</imageName>
                            <imageTags>
                                <!--构建的镜像的tag,可以设置多个, 但是push的时候,会有一些报错,建议设置一个-->
                                <imageTag>${project.version}</imageTag>
                            </imageTags>
                            <!--Dockerfile-->
                            <dockerDirectory>${project.basedir}</dockerDirectory>
                            <!--用于将构造的jar的文件名传入Dockerfile-->
                            <buildArgs>
                                <Jar_File>${project.build.finalName}.jar</Jar_File>
                            </buildArgs>
                            <!--docker的地址和相关证书-->
                            <dockerHost>${docker.host}</dockerHost>
                            <dockerCertPath>E:\\Docker\\Docker\\ca</dockerCertPath>
                            <resources>
                                <resource>
                                    <!--放在容器的位置-->
                                    <targetPath>/</targetPath>
                                    <!--需要移动的资源的位置-->
                                    <directory>${project.build.directory}</directory>
                                    <include>${project.build.finalName}.jar</include>
                                </resource>
                            </resources>
                            <!--调用setting中设定好的server中的用户密码-->
                            <serverId>nexus</serverId>
                            <!--dockerHub的位置,注意不要带http://,否则push会报错-->
                            <registryUrl>${dockerhub.host}</registryUrl>
                        </configuration>
                        <executions>
                            <execution>
                                <id>build-image</id>
                                <!--对应maven中的一个生命阶段-->
                                <phase>package</phase>
                                <!--对应docker中的操作-->
                                <goals>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>tag-image</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>tag</goal>
                                </goals>
                                <configuration>
                                    <image>${project.artifactId}:${project.version}</image>
                                    <newName>${dockerhub.host}/${project.artifactId}:${project.version}</newName>
                                </configuration>
                            </execution>
                            <execution>
                                <id>push-image</id>
                                <phase>deploy</phase>
                                <goals>
                                    <goal>push</goal>
                                </goals>
                                <configuration>
                                    <imageName>${dockerhub.host}/${project.artifactId}:${project.version}</imageName>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>


对应的Dockerfile定义为:

FROM java:8-jre-alpine
ARG Jar_File
ADD ${Jar_File} /app.jar
ENTRYPOINT ["java","-jar","-Dserver.port=8080","/app.jar"]
EXPOSE 8080

至于构造war包的镜像配置,这里留个坑🕳

5. 上传项目的docker镜像

配置同样在上面,已经将push方法绑定到了deploy方法上了,在上传jar包的时候,同时也会上传image镜像。


  1. 详见:mirror和repository的区别 https://www.cnblogs.com/bollen/p/7143551.html

  2. 参见: https://blog.csdn.net/ahilll/article/details/84428894

  3. 基于docker 安装 nexus: https://www.jianshu.com/p/86e573f18df3?from=singlemessage

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容