1. 序言
- 在玩Presto时,最多是
mvn clean install -DskipTests
- 在没有通过MAVEN_OPTS设置为较大内存时,甚至还用上了多线程加速
-DskipTests
,表示跳过测试-Dmaven.compile.fork=true
,表示允许进行多线程编译-T
表示多线程,2C
表示每核2个线程。假设这是一个64核的服务器,则在进行构建时可以使用 2 * 64 = 128个线程
mvn -T 2C clean install -DskipTests -Dmaven.compile.fork=true
- 关于maven的并行构建,可以参考官方文档:Parallel builds in Maven 3
- 但是,自从接触maven依赖,自己还从没将项目deploy到maven远程仓库(私服)过
- 在这里记录下,将Presto 0.240版本部署到maven私服遇到问题和解决办法
2. 准备工作
-
要想将presto部署到私服,需要设置在settings.xml文件中添加私服的server
-
一般release版本和snapshot版本,有各自的私服server
<servers> <server> <id>nexus-releases</id> <username>admin</username> <password>p@ssword</password> </server> <server> <id>nexus-snapshots</id> <username>admin</username> <password>p@ssword</password> </server> </servers>
-
然后,需要在presto-root模块的pom.xml文件的倒数第二行,添加仓库配置
<!-- 项目打包上传配置 --> <distributionManagement> <repository> <!-- 这里的id要与server中的id保持一致 --> <id>nexus-releases</id> <name>Local Nexus Repository</name> <url>http://xxx.com/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>nexus-snapshots</id> <name>Local Nexus Repository</name> <url>http://xxx.com/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement>
3. deploy过程中的注意事项
3.1 模块version与父模块保持一致
问题描述
-
为了避免与来自maven中央仓库的Presto官方版本的maven坐标冲突,将
presto-root
(presto项目的父模块和聚合模块)的version从0.240
更新为0.240-deploy-SNAPSHOT
<groupId>com.facebook.presto</groupId> <artifactId>presto-root</artifactId> <version>0.240-deploy-SNAPSHOT</version> <packaging>pom</packaging>
-
使用如下命令进行部署
mvn clean deploy -DskipTests -Dmaven.compile.fork=true
-
执行时报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle) on project presto-bm-functions: Failed during checkstyle execution: Unable to find configuration file at location: src/checkstyle/presto-checks.xml: Could not find resource 'src/checkstyle/presto-checks.xml'. -> [Help 1]
报错原因分析
-
从报错信息看,在执行checkstyle时,
presto-bm-functions
模块找不到checkstyle的配置文件presto-checks.xml
-
checkstyle的配置文件,位于
presto-root
模块的src/checkstyle/presto-checks.xml
-
通过检查
presto-bm-functions
模块的pom.xml文件发现,该模块指定的父模块presto-root的version还是0.240<parent> <groupId>com.facebook.presto</groupId> <artifactId>presto-root</artifactId> <version>0.240</version> </parent>
-
错误的version,怎么可能找到父模块
presto-root
呢?
解决办法:
- 将所有子模块中定义的presto-root的version都改为
0.240-deploy-SNAPSHOT
3.2 上传私服时,提示Request Entity Too Large
- 整个部署进到一大半了,结果出错了
Error deploying artifact: Failed to transfer file: http://xxx.xxx.xxx.xxx/nexus/content/repositories/snapshots/com/facebook/0.240-deploy-SNAPSHOT/presto-server-0.240-deploy-SNAPSHOT.tar.gz. Return code is: 413, ReasonPhrase: Request Entity Too Large.
- 通过查阅资料发现,应该是最后生成的安装包presto-server-0.240-deploy-SNAPSHOT.tar.gz过大(800多MB)
解决方法一:修改nginx配置
- 更新nginx(或ingress)的配置,使serverdaunt允许接收更大的entity
解决方法二:禁止生成安装包
- 通过查看
presto-server
模块的pom.xml文件发现,maven-assembly-plugin
插件控制其生成tar.gz安装包 - 为了以绝后患,整个Presto项目中,所有使用到
maven-assembly-plugin
插件的,都将该插件注释掉
3.3 Could not transfer artifact xxx:Network is unreachable
问题描述
- 超级奇怪的事情,一直都使用的settings.xml文件,在部署到私服时突然报错
- 提示到某个仓库的网络不通,无法获取
com.sun:tools:pom:1.8
[ERROR] Failed to execute goal com.hubspot.maven.plugins:dependency-scope-maven-plugin:0.8:check (default) on project presto-main: Error resolving descriptor for artifact com.sun:tools:1.8: Failed to read artifact descriptor for com.sun:tools:jar:1.8: Could not transfer artifact com.sun:tools:pom:1.8 from/to nexus-aliyun (http://xxxx/nexus/content/repositories/public/): Transfer failed for http://xxx/nexus/content/repositories/public/com/sun/tools/1.8/tools-1.8.pom: Network is unreachable (connect failed) -> [Help 1]
问题的解决
- 最开始,还以为是自身的网络问题,等到第二天再试试。第二天还是同样的问题,于是求助同事
- 负责maven私服的同事说,这个仓库地址是其他领域的仓库地址,这个仓库最近可能出问题了无法使用
- 建议将其他领域的仓库地址去除,只保留我所在领域的仓库地址,说这个地址应该能满足我所有的需求
一点小收获
-
自己后来总结了下,错误原因如下:
- 配置的仓库可能存在问题,导致无法访问
- 服务器网络管控,无法访问外部仓库地址
-
菜鸟的解决办法:
- 找一个使用正常的settings.xml配置,照抄作业(当然,感兴趣的大佬可以自己研究研究)
3.4 presto-server-rpm模块的处理
3.4.1 关于rpm
- presto中,除了有presto-server模块,还有一个presto-server-rpm模块
- 看了presto-server-rpm模块的README.md,大意是:presto-server-rpm模块可以提供RPM包以便使用RPM方式安装Presto
You can build an RPM package for Presto server and install Presto using the RPM. Thus, the installation is easier to manage on RPM-based systems.
- 通过上网查阅资料,发现博客《Linux下rpm软件包rpm命令的安装及卸载》是这样介绍RPM的
RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件。
Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM 完成安装 - 突然想起来,貌似Linux系统的软件安装包,大多都是以
.rpm
结尾的,例如JDK的安装除了tar包,还有rpm包
- 这些rpm包可以使用
rpm
命令进行安装,只是我们可能习惯了使用yum
(CentOS 系统)、apt-get install
(Ubuntu系统) - 之所以不直接使用rpm命令,博客《如何在 CentOS Linux 上安装 RPM 软件包》中说,这是因为
rpm
命令不会解决依赖问题
3.4.2 deploy时,不部署presto-server-rpm模块
-
如果不对presto-server-rpm模块的pom.xml文件做任何改动,deloy时target目录将生成
.rpm
文件
-
.rpm
文件有800多MB,上传到私服时,会因为Request Entity Too Large
问题而部署失败 -
所以,需要修改presto-server-rpm模块的pom.xml文件,使其不要生成
.rpm
文件 -
具体改动如下:
// 打包方式为rpm,将其注释掉 <!--<packaging>rpm</packaging>--> // 注释掉依赖,这是因为之前的presto-server模块并未生成tar.gz包,若不注释掉,编译无法通过 <!-- <dependency> <groupId>com.facebook.presto</groupId> <artifactId>presto-server</artifactId> <type>tar.gz</type> <scope>runtime</scope> </dependency> --> // 注释掉对maven-dependency-plugin插件的配置 <!-- <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> ...... </plugin> -->
4. 同事的deploy方法
-
自己直接使用
mvn deloy
,会将Presto的每个模块都上传到私服 -
后来,偶然看到了同事写的公共帮助文档
-
发现该同事是将打包编译后的安装包,通过
mvn deploy:deploy-file
直接上传到私服的 -
完整的
mvn deploy:deploy-file
命令如下,关于deploy:deploy-file的详细说明可以查看官网mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile={源码包本地目录} -DgroupId={包的groupId} -DartifactId={包的artifactId} -Dversion={包的版本} -Dpackaging=jar -DrepositoryId={仓库id,就是在settings.xml中配置的<server> -> <id>} -Durl={私服地址}
-
我和同事的两种方式都通过扫描了,如果其他人有同样的需求,请一定要询问相关同事,确定通过何种方式deloy到私服!