美文网首页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