前言
-
不懂什么是REST,首先是看了微服务(Microservice)那点事中讲到服务之间通信方法选择之一就是REST。
然后就去搜了几篇文章看看相关知识。
RESTful 架构风格概述
什么才是真正的 RESTful 架构?
RESTful API 编写指南
RESTful架构 文集 -
开发RESTful API好像挺重要的,所以想尝试一下,因为是学java的,看了Spring也提供了对RESTful的支持,所以按照Spring官网的例子写了下来。
-
这篇文章为什么写在这里?因为使用maven编译这个项目搞了半天,出现了几个错误,所以记录一下,关于这个demo完全参考spring上案例写的,详细请看Building a RESTful Web Service。
-
看该篇文章之前应该先了解一下maven---9使用Nexus创建私服
1.根据介绍编写完代码
-
学习Spring的Building a RESTful Web Service的demo,git clone下来项目后,根据提示写完代码,开始使用maven进行构建。
-
maven项目的pom文件,从pom中可以看出,项目会请求https://repo.spring.io/libs-release 远程仓库。
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结束项目运行
留言
有什么不懂的一起探讨一下吧,欢迎留下宝贵意见,喜欢就点个赞吧(哈哈),多谢鼓励。
网友评论