美文网首页
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仓库的搭建

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