第一次在CSDN写博客(作者注:本文最初发表在我的CSDN博客上)......
这几天因为要重构项目(之前的项目开发太烂了...),人手又不够,所以我们这两三个码畜是既当码畜又赶鸭子上架做着项目经理的活...为了更好的管理项目,被老板拉着学了些项目版本管理的东西,虽然本行是 “两耳不闻身外事,一心只撸咱的码”,但是学点儿版本控制的这些东西毕竟还是非常有用的。
在老板的建议下从Ant入手,再加上一些SVN的分支管理,应该够平时用的了吧...
Ant这个东西很早就在eclipse见到过,myeclipse更是少不了它:
刚接触了Ant差不多一个星期,感觉是还是挺简单的。和写java一样,只要理清思路,稍微看一下文档,很容易上手。
废话不扯了,最近碰到一个问题,困了我两天了,不是解决不了,而是网上很少有相应的解决方案......刚刚把这个问题给Kill掉,鸡冻之余,分享一下!
【前提】:使用Ant打WAR包
【思路】:
1、初始化一些参数(包括项目根目录、src目录、WebContent目录、lib目录以及对应的build的根目录、lib目录、classes目录等等)
2、使用<mkdir />
创建build需要的目录
3、使用<javac />
编译java源文件,并保存到build的classes目录下
4、使用 <copy />
复制项目下的lib目录到build中与之对应WEB-INF目录下
5、使用<war />
打包
【问题】:在进行第3步编译src下的java文件时总是提示: [javac] 致命错误: 在类路径或引导类路径中找不到程序包 java.lang
有图有真相:
部分源代码如下:
<target name="compile" depends="mkdirs,copy.lib" description="javac"><!-- 编译源代码 同时指定依赖 -->
<javac srcdir="${pty.dir.proj.src}" destdir="${pty.dir.proj.build.classes}" encoding="utf-8">
<bootclasspath>
<fileset dir="${pty.dir.lib.tomcat}">
<patternset refid="pat.find.jar"></patternset>
</fileset>
<fileset dir="${pty.dir.proj.web.lib}">
<patternset refid="pat.find.jar"></patternset>
</fileset>
</bootclasspath>
</javac><!-- 执行编译 指定源代码目录及编译文件输出目录-->
</target>
【解决过程】:因为是周末,一直宅在家里,百度 + Google苦搜无果,换着关键词搜来搜去只有第一页的十来个,也不是我想要的。大哭
中间费了九牛二虎之力偶尔一次可以编译成功了,我还忘了备份一下了。直接在源代码上又接着改了什么,结果又坏掉了...........大哭
一种说法: 找不到 java_home设置不正确;
第二种说法:classpath环设置不正确;
第三种说法:重装JDK...
第四种说法:classpath应该加上dt.jar、rt.jar、tools.jar
第五种说法:环境变量去掉空格(估计有很多人和我一样,JDK是装在X:\Program Files\下的)
第六种说法:忘了.......
总之很多...
在苦苦挣扎中,我还是不放弃...每次只改一个可疑的地方,每改一次都要运行一下,看看会不会对了......
功夫不负有心人,当我把<bootclasspath />
换成<classpath />
时,奇迹再次出现了...
我之前没仔细研究这两者之间的差别,才多走了很多冤枉路。
亲,不知道你是不是和我犯的一样的错误...如果是现在大概明白了吧...如果还不明白就去查下<bootclasspath />
和 <classpath />
的区别吧...
附:
网上有一段话解释到:【bootclasspath
参数(启动类库):它已经包含了jre/lib目录下的rt.jar,以及我们自定义的类库。如果使用classpath参数,仅指我们定义的库。】,所以反推之,如果我们已经在环境变量里指定了rt.jar等,这里只需要指定引入的第三方jar(如servlet-api.jar、log4j.jar、spring.jar、axis.jar等),则在<javac />
使用classpath
指定这些jar即可。如果误用了bootclasspath
去指定这些第三方的jar,而没有指定rt.jar等这些很可能会报和我一样的【致命错误】...(我的理解是bootclasspath
覆盖了环境变量里的设置)。如果一定要用bootclasspath
,则应该指定rt.jar这些JDK自带的jar(不过我没试过...)
碎觉!