core瘦身后,pcserver上开发的项目变化较大,许多tx都有点不适应新的开发环境,特别是如果对于antx操作命令理解不是很透彻,就会出现许多环境上的问题,影响了开发效率,本文就是在实际开发过程中遇到了类似问题及其解决过程,如果大家觉得过程没意思,可以看完现象部分后直接跳到结论部分,不必为繁杂的过程而浪费时间。
发现问题
昨天晚上为了把新分支中拉出来的项目导入eclipse,顺手就敲了个命令antx reactor goals=clean,eclipse,在eclipse中导入项目后发现一堆的红叉叉,这个问题以前也发现过,也都没有过多的去研究,直接找到项目所缺的依赖工程,加到项目的build path中就OK了,但是心念一动,为什么不深究一下为什么会这样呢?
观察现象
首先找到总控项目的project.xml文件,观察项目依赖,发现apps项目依赖的其它项目都是存在的
…...
然后看生成的.classpath文件,生成的classpathentry中没有src部分,例如:
所以Eclipse无法自动生成项目间的依赖
分析问题一
查了一下antx文档,标准的用法是:antx reactor goals=clean,default,eclipse,那么我的用法有什么问题呢?在pcserver上查看build.sh,发现其中有一步:antx reactor goals=clean,default -u /home/admin/aep/apps/antx.properties,也就是说在pcserver上拉代码的时候已经把clean和default这两个goal已经做了,那么是不是我多用了一个clean导致的问题呢?
首先重新执行了一遍build.sh,然后在windows下面执行antx reactor goals=eclipse,在Eclipse中刷新、重新编译,还是一堆红叉叉,看来不是clean的问题。
仔细再看antx文档,clean用于清除生成的classes目录下的文件;default用于将项目打成jar文件;eclipse用于生成Eclipse所需的.project和.classpath文件;那么为什么我在pcserver上执行了clean和default,在windows下执行eclipse就不行呢?
分析问题二
检查windows下执行标准的antx reactor goals=clean,default,eclipse,狂慢,打开home目录下的antx.properties文件:
antx.repository = local, project, external
antx.repository.project = Z:/repository.project
antx.repository.external = Z:/repository
原来第二方和第三方库用的是pcserver共享目录中的repository,所有的jar文件读取都在Samba共享上,当然很慢啦,改成本地的第二方和第三方库,并把本地的repository都svn up一把,执行速度快了很多。刷新Eclipse,红叉叉消失了。可是问题又来了,在build.sh中明显已经做过clean和default了,在windows下再做一遍多么低效啊。
分析问题三
在入职的antx培训文档中得知eclipse命令是以antx插件的形式存在的,在antx的源文件目录找到了eclipse插件源文件:antx/plugin/antx-eclipse/plugin.jelly,仔细读了一下,最后几句是用来生成src类型的classpathentry的:
也就是说是否生成这部分classpathentry,是由internalProjects这个HashSet中是否包含project.xml中包含的项目来决定的,为了更进一步研究这部分功能,只能求助于antx源代码了
打开antx的源文件,这里提下antx的源代码形式,真的非常赞,代码目录不光包括了所有的第三方库,还包含一个build文件,里面提供清除环境的target:clean-all ;生成eclipse项目文件的target:eclipse-all ;发布antx项目的target:dist;我们平时默认只用到了它的dist,生成antx的执行文件,其要想了解antx的源代码也是很方便的。导入antx源码后问题又来了,由于没有antx的底层设计文档,无法得知代码从哪里开始运行,因此看源码也无从下手,在打了几个log并重新编译antx若干次后,无意发现在antx的执行目录竟然存在一个antx-debug.bat,运行后发现其竟然打开了8000端口,用Eclipse连上去后,在若干靠谱的地方打上点,成了!依靠不断的反向运行,终于找到了antx运行的入口点。
分析代码的过程不再复述,在jar这个goal中,除了生成jar文件以外,还将这些生成的jar安装到local repository中,代码如下:
结论
antx的default命令(在apps项目中就是jar命令)不光生成了jar文件,还会将jar文件注册到第一方库中,所以在pcserver上执行的default命令只是将这些项目的jar文件注册在Linux环境中的第一方库中,到windows中执行eclipse命令由于找不到这些第一方库文件,所以无法生成项目依赖,我们要做的其实非常简单:
1. 将windows下home目录中的antx.properties文件改为:
antx.repository = local, project, external
antx.repository.local = Z:/.antx/repository
antx.repository.project = Z:/repository.project
antx.repository.external = Z:/repository
将第一方库指向pcserver上的第一方库位置
2. 按照普通流程拉代码:sh build.sh
3. 在windows下执行antx reactor goals=eclipse,刷新Eclipse,搞定!
其它方案
组里其他同学也提出了一个方案:在build.sh中的antx命令加入eclipse,即:antx reactor goals=clean,default,eclipse,然后运行一个本地的脚本,替换生成的.classpath文件中的jar文件路径,将/home/admin/repository...替换为windows下的Z:/repository…
这种做法其实也可以解决问题,好处是速度快,都是在Linux下执行,不用在windows下维护一套antx的环境,如antx.propertis文件;问题是如果我们的项目增加了,或者修改了路径等,这个本地脚本就要随之改变。大家可以根据自己的实际情况选择使用。
有同学提出在antx运行过程中有无数的WARN,屏幕被刷的厉害,其实只要找到$ANTX_HOME$/../../main/src/java/com/alibaba/antx/repository/query/LibraryItemQuery.java文件,找到235行的System.out并删除这句话,然后运行$ANTX_HOME$/../../build.bat(sh)就可以了。