第一次在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(不过我没试过...)

碎觉!

About Me
后端开发工程师
GitHub Repos