美文网首页
1 Maven仓库的搭建

1 Maven仓库的搭建

作者: CodingForChange | 来源:发表于2021-01-04 00:39 被阅读0次

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

相关文章

  • 1 Maven仓库的搭建

    Maven仓库的搭建 1. 仓库选型 这里经过了解,好像没有什么其他的选择,Nexus就是一个不二之选,网上的帖子...

  • Maven 仓库使用与私有仓库搭建

    拥抱 Android Studio 之四:Maven 仓库使用与私有仓库搭建 使用Artifactory简单搭建本...

  • Maven私服Nexus的搭建

    Maven私服Nexus的搭建 私服存在的合理性 Maven中的依赖是从服务器仓库中下载的,Maven的仓库只有两...

  • 阿里云maven仓库使用

    如果公司没有搭建私服仓库,那下包是十分痛苦的事情。不过好在有阿里云的maven仓库。1.maven构建项目在set...

  • 使用nexus搭建maven私库

    什么是nexus? nexus是一个maven仓库管理器,使用nexus可以快速便捷的搭建自己的maven私有仓库...

  • nexus 创建私服仓库上传jar包

    前提条件 : 本地搭建好nexus私服仓库 如何搭建nexus私服请参考: Nexus、Maven仓库介绍以及在项...

  • 搭建maven仓库

    https://blog.csdn.net/qq_39361915/article/details/1225611...

  • maven

    本地导入gitlab仓库 搭建环境 搭建maven环境Linux的alpine版的镜像adminie_jenkin...

  • maven仓库的搭建

    1.仓库 1.1:本地仓库: 1.2:中心仓库: 1.3:私有仓库: 局域网内部的仓库 2 nexus的安装: 1...

  • 第5章 总结

    5.1 maven 仓库 1、maven 仓库的类型有哪些? 2、maven 工程查找仓库的流程是什么? 3、本地...

网友评论

      本文标题:1 Maven仓库的搭建

      本文链接:https://www.haomeiwen.com/subject/cclmoktx.html