- 前言
core瘦身后,pcserver上开发的项目变化较大,许多tx都有点不适应新的开发环境,特别是如果对于antx操作命令理解不是很透彻,就会出现许多环境上的问题,影响了开发效率,本文就是在实际开发过程中遇到了类似问题及其解决过程,如果大家觉得过程没意思,可以看完现象部分后直接跳到结论部分,不必为繁杂的过程而浪费时间。
- 发现问题
昨天晚上为了把新分支中拉出来的项目导入eclipse,顺手就敲了个命令antx reactor goals=clean,eclipse,在eclipse中导入项目后发现一堆的红叉叉,这个问题以前也发现过,也都没有过多的去研究,直接找到项目所缺的依赖工程,加到项目的build path中就OK了,但是心念一动,为什么不深究一下为什么会这样呢?
- 观察现象
首先找到总控项目的project.xml文件,观察项目依赖,发现apps项目依赖的其它项目都是存在的
<dependencies>
<include uri="alisoft/aep/core/common/api"/>
<include uri="alisoft/aep/core/common/web"/>
<include uri="alisoft/apps/biz/settlement"/>
<include uri="alisoft/apps/ext/biz"/>
<include uri="alisoft/apps/ext/api"/>
<include uri="alisoft/apps/biz/coupon"/>
…...
</dependencies>
然后看生成的.classpath文件,生成的classpathentry中没有src部分,例如:
<classpathentry kind="src" path="/alisoft-apps-common-biz">
</classpathentry>
所以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的:
<j:useBean var="internalProjects" class="java.util.HashSet"/>
<j:forEach var="dep" items="${items}">
<j:if test="${!internalProjects.contains(pom.getProjectTargetId(dep.library.URI))}">
<classpathentry kind="src" path="/${pom.getProjectTargetId(dep.library.URI)}"/>
<j:set var="dummy" value="${internalProjects.add(pom.getProjectTargetId(dep.library.URI))}"/>
</j:if>
</j:forEach>
也就是说是否生成这部分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中,代码如下:
<repository:install uri="${jar.library.name}" profile="${profile}">
<repository:item path="${jar_destfile.file}" sourcePath="${java.srcdir}"/>
<j:if test="${jar_mergeDependencies == null or jar_mergeDependencies == ''}">
<j:forEach var="dep" items="${deps}">
<repository:required uri="${dep}"/>
</j:forEach>
</j:if>
</repository:install>
- 结论
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运行过程中有无数的WARN,屏幕被刷的厉害,其实只要找到$ANTX_HOME$/../../main/src/java/com/alibaba/antx/repository/query/LibraryItemQuery.java文件,找到235行的System.out并删除这句话,然后运行$ANTX_HOME$/../../build.bat(sh)就可以了。
Antx的eclipse操作深究
最新推荐文章于 2023-05-05 08:10:34 发布
本文详细探讨了在Eclipse环境下使用Antx时遇到的问题,包括WARN信息的分析,以及解决dependencies和jar包包含的问题。通过对现象的观察和问题的深入剖析,提供了有效的解决方案和备选方案。
7802

被折叠的 条评论
为什么被折叠?



