使用javac进行编译时出现问题

时间:2011-07-09 13:43:23

标签: java tomcat ant zip javac

当我尝试使用javac任务编译时。我在控制台中没有得到任何东西。以前,我得到了一些关于我正在编译的信息,例如[javac]“....”

什么时候,我清理并重新编译它有效,我可以看到输出,但是当我再次编译时会出现问题。

同样,此问题以前不存在。而这个问题让tomcat抱怨.war文件它说“ZipException:oversubscribed literal / length tree”

有人能引导我解决这个问题吗?

编辑:这是蚂蚁脚本的相关部分

<javac destdir="${build.dir}" source="1.6" target="1.6" debug="true" deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}" />
      <classpath refid="master-classpath" />
</javac>   

请注意:以前在相同的文件上工作得非常好。现在没有改变项目中的任何内容它不起作用

请注意:我的项目正在运行,我已将其归档。它编译完美,我甚至将存档文件提供给了一些人,并且正在与他们合作。然后,我做了一些修改,直到我得到ZipException。 之后我保留了修改并使用了正在运行的旧存档文件,我仍然得到相同的错误ZipException。所以,问题是肯定不是源代码或蚂蚁脚本。我相信这是我环境中的一个问题,但我无法弄清楚出了什么问题。

build.xml文件如下:

<?xml version="1.0"?>
<!DOCTYPE project>
<project name="GameServerPart1" basedir="." default="usage">
    <property file="../build.properties" />

    <property name="src.dir" value="src/main/java" />
    <property name="web.dir" value="war" />
    <property name="build.dir" value="${web.dir}/WEB-INF/classes" />
    <property name="name" value="GameServerPart1" />

    <path id="master-classpath">
        <fileset dir="src/main/webapp/WEB-INF/lib">
            <include name="*.jar" />
        </fileset>
        <!-- We need the servlet API classes: -->
        <!--  * for Tomcat 5/6 use servlet-api.jar -->
        <!--  * for other app servers - check the docs -->
        <!--<fileset dir="${appserver.lib}">
            <include name="servlet*.jar"/>
        </fileset> -->
        <pathelement path="${build.dir}" />
    </path>

    <target name="usage">
        <echo message="" />
        <echo message="${name} build file" />
        <echo message="-----------------------------------" />
        <echo message="" />
        <echo message="Available targets are:" />
        <echo message="" />
        <echo message="build     --> Build the application" />
        <echo message="deploy    --> Deploy application as directory" />
        <echo message="deploywar --> Deploy application as a WAR file" />
        <echo message="cleanr    --> clean the build." />
        <echo message="" />
    </target>

    <target name="clean">
        <delete dir="${web.dir}" />
    </target>

    <target name="build" description="Compile main source tree java files">
        <mkdir dir="${build.dir}" />
        <copy todir="${web.dir}/WEB-INF/">
            <fileset dir="src/main/webapp/WEB-INF/">
                <include name="**/*.*" />
            </fileset>
            <filterchain>
                <striplinecomments>
                    <comment value="!" />
                </striplinecomments>
                <replacetokens>
                    <token key="hibernate.connection.url" value="${hibernate.connection.url}" />
                    <token key="hibernate.connection.username" value="${hibernate.connection.username}" />
                    <token key="hibernate.connection.password" value="${hibernate.connection.password}" />
                    <token key="fontFamily" value="arial, helvetica, sans-serif" />
                </replacetokens>
            </filterchain>
        </copy>
        <copy todir="${build.dir}">
            <fileset dir="src/main/resources">
                <include name="**/*.*" />
            </fileset>
            <filterchain>
                <striplinecomments>
                    <comment value="!" />
                </striplinecomments>
                <replacetokens>
                    <token key="hibernate.connection.url" value="${hibernate.connection.url}" />
                    <token key="hibernate.connection.username" value="${hibernate.connection.username}" />
                    <token key="hibernate.connection.password" value="${hibernate.connection.password}" />
                    <token key="fontFamily" value="arial, helvetica, sans-serif" />
                </replacetokens>
            </filterchain>
        </copy>

        <javac destdir="${build.dir}" source="1.6" target="1.6" debug="true" deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}" />
            <classpath refid="master-classpath" />
        </javac>
    </target>

    <target name="deploywar" depends="build" description="Deploy application as a WAR file">
        <war destfile="${name}.war" webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*" />
            </fileset>
        </war>
        <move todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war" />
            </fileset>
        </move>
    </target>

</project>

4 个答案:

答案 0 :(得分:1)

我发现了问题。

    <copy todir="${web.dir}/WEB-INF/">
        <fileset dir="src/main/webapp/WEB-INF/">
            <include name="**/*.*" />
        </fileset>
        <filterchain>
            <striplinecomments>
                <comment value="!" />
            </striplinecomments>
            <replacetokens>
                <token key="hibernate.connection.url" value="${hibernate.connection.url}" />
                <token key="hibernate.connection.username" value="${hibernate.connection.username}" />
                <token key="hibernate.connection.password" value="${hibernate.connection.password}" />
                <token key="fontFamily" value="arial, helvetica, sans-serif" />
            </replacetokens>
        </filterchain>
    </copy>

应该是

    <copy todir="${web.dir}/WEB-INF/">
        <fileset dir="src/main/webapp/WEB-INF/">
            <include name="**/*.*" />
        </fileset>
    </copy>

然后一切都好。

答案 1 :(得分:0)

谷歌搜索该异常消息表明它是由于您(Tomcat)尝试阅读的ZIP文件损坏。为了弄清楚它被破坏的原因,我们需要有关如何构建WAR文件的更多信息。

答案 2 :(得分:0)

我尝试删除由clean删除的各种构建工件集,以查看导致问题的原因。希望这能够充分洞察问题并找出答案。

答案 3 :(得分:0)

Ant的编译器任务是智能的,因为如果它检测到输出类比源类更新,那么编译器会断定该类必须已经从源代码构建。在这种情况下,编译器将不执行任何操作(因为已经检测到工作已完成)。

当编译器没有做任何事情时,就没有输出。

第一次编译后,打开源文件,进行一些微不足道的更改(例如注释),然后保存文件。这将使源比现有的编译类更新。然后,当您调用Ant任务来构建类时,javac任务将检测到源比该类更新,并且它将重新编译生成新类文件的源文件。

由于javac任务将执行某些操作,因此它将有一些要报告的内容;所以,你应该看到一些输出(但是如果你必须构建所有东西的话,那就少了。)