美文网首页maven程序员Java Web
maven---编译Spring上一个RESTful风格的web

maven---编译Spring上一个RESTful风格的web

作者: zlcook | 来源:发表于2016-12-28 22:10 被阅读244次

    前言

    1.根据介绍编写完代码

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-rest-service</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.jayway.jsonpath</groupId>
                <artifactId>json-path</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </pluginRepository>
        </pluginRepositories>
    </project>
    
    

    2使用maven构建出现问题

    2.1出现问题

    1.执行mvn compile出错


    第一次执行mvn compile

    2.没做任何改动再次请求,还是出错,但是发现问题有变化。


    第二次执行mvn compile

    2.2原因分析

    第一次执行错误原因:之前将本地的所有maven项目都设置访问nexus私服的仓库组maven-pulic,而我的nexus私服所在服务器没有连接网络,也没有为spring远程仓库设置代理仓库。所以请求后下载不到插件,下载失败。
    第二次执行错误原因:根据maven仓库更新策略updatePolicy(默认一天),如果你想让maven再次更新构件必须等到更新时间到期,才会继续更新,否则不会更新,直接将上次更新的结果返回给你。即maven没有再次去请求nexus而是缓存了上次错误结果直接返回了。

    2.2解决步骤

    2.2.1步骤一

    1.让 nexus所在服务器连接网络,设置代理仓库代理spirng的远程仓库(https://repo.spring.io/libs-release), 将代理仓库添加到仓库组maven-pulic中。

    从项目的pom中可以看出,项目会请求https://repo.spring.io/libs-release 远程仓库,nexus仓库没有配置spring的远程仓库代理,所以就下载不到构件

    • 设置代理仓库spring-release


      nexus配置spring远程仓库代理
    • 因为本地maven配置镜像访问nexus中名为mvaen-public的仓库组,所以把spirng-release加到仓库组中。

    加入到仓库组

    上面步骤设置完后,nexus服务器就可以从spirng仓库中下载需要的插件了。下面的设置让本地的maven连接nexus下载构件。

    2.2.1步骤二

    • 因为本地缓存了上次 失败的结果,所以在更新周期没到时不会再次请求远程仓库。而要再次请求,解决思路两个1.是等更新时间到期(不采纳)2.强制让maven执行更新策略。3.删除掉上次更新记录,让maven以为自己之前没有更新过。2和3的方法如下:
      1.执行mvn clean compile命令加上参数-U强制执行更新策略(updatePolicy),更新时就会发现本地没有,然后去远程仓库nexus去下载。(推荐)
      2.删除掉刚才更新记录文件,重新执行mvn clean compile命令就会更新构件,更新时就会发现本地没有,然后去远程仓库nexus去下载。(不推荐,文件太多不好删)
    • 对于方法一
      执行mvn clean compile -U就会重新更新构件,也就会去下载构件。
    • 对于方法二删除文件做法如下:
      找到刚才更新记录文件,和构件在一个位置:

    仓库构件存放规则groupId/artifactId/version/artifactId-verson.packaging。

    下载的构件信息

    文件内容如下:

    #NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
    #Wed Dec 28 15:36:47 CST 2016
    http\://172.19.201.155\:8081/repository/maven-public/.lastUpdated=1482910607287
    http\://172.19.201.155\:8081/repository/maven-public/.error=
    
    

    删掉本地下载失败的构件文件
    在执行mvn clean compile

    成功

    3运行项目

    3.1失败(求解)

    • mvn clean package spring-boot:run -U运行项目失败,第一天没解决,有知道的请指教错误如下:


      Paste_Image.png

    3.1.1分析

    • 错误提示:“repackage目标执行失败,因为所需要的依赖没有解析到,提示中提到两个依赖plexus-io.2.3.2.jar和guava.18.0.jar传输失败。”
      先来理一下maven执行repackage目标的正常步骤如下:

    • maven执行repackage目标的思路: maven执行repackage目标发现有依赖构件plexus,guava,于是解析依赖,先从本地仓库找,没有找到去远程nexus的maven-pulic仓库组中下载,maven-pulic遍历它包含的仓库去下载需要的依赖(根据依赖的groupId=codehaus知是去中央仓库下载),然后把下载的依赖传回给本地仓库同时经过解析加载到classpath中,这样repackage目标的依赖就解析完毕开始执行repackage目标。

    • 根据上面的正常步骤再来看提示:
      根据"Could not transfer ... plexus-io.2.3.2.jar ....from/to nexus..."提示来看,好像是要将plexus-io.2.3.2.jar这个文件从/传输到nexus上的maven-pulic仓库组中,但是from/to nexus中的from/是指哪里呀?后面一句"Failed to transfer file ....plexus-io.2.3.2.jar”表明plexus-io.2.3.2.jar就是在maven-public中了呀?再根据上面maven执行repackage目标的思路来看,就应该知道是传输maven-pulic中的plexus-io.2.3.2.jar文件到本地仓库失败。因为maven命令在本地执行的所以是传输到本地呀。

    • 那就想传输失败原因是什么呀?我在想是不是nexus服务器端网络不好,因为会传输很多文件,正好到plexus-io.2.3.2.jar文件时失败了(我再次执行时是传输其它文件时失败,所以和文件无关应该是网络原因)。导致文件下载不来?还是mvn依赖的问题?。为了验证猜想,我把本地maven的settings.xml文件中关于对nexus服务器的镜像映射给去掉,这样maven就不通过nexus来下载构件而是直接去相关的远程仓库下载,这样的话直接下载到本地仓库,省的在从nexus转传一下。这就是下面3.2讲的,最后成功了。


    • 后记,第二天我又修改了settings.xml,让其从nexus下载构建,再次运行如下命令: mvn clean package -U和mvn spring-boot:run 后又可以运行了。
      那应该是网络原因吧,当然有待多次实验。

    3.2 尝试成功

    我把maven的settings.xml的关于nexus的镜像给去了,让项目不通过nexus访问远程仓库。
    然后执行如下命令,结果成功。

    • 执行mvn clean package spring-boot:run命令,启动成功


      Paste_Image.png
    访问成功

    ctr+C结束项目运行

    留言

    有什么不懂的一起探讨一下吧,欢迎留下宝贵意见,喜欢就点个赞吧(哈哈),多谢鼓励。

    相关文章

      网友评论

      本文标题:maven---编译Spring上一个RESTful风格的web

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