【问题标题】:Problem when compiling using javac使用 javac 编译时的问题
【发布时间】:2011-07-10 23:26:15
【问题描述】:

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

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

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

谁能指导我解决这个问题?

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

<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。因此,问题绝对不是源代码或 ant 脚本。我认为这是我的环境中的一个问题,但我无法弄清楚出了什么问题。

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>

【问题讨论】:

  • 你在使用 ANT 吗?你的 ANT 脚本是什么?细节量不够
  • 和tomcat有什么关系?试试ant -d
  • 我刚刚添加了我拥有的所有信息。实际上,这是我将应用程序部署到 tomcat 的目标,这也是我调查正在发生的事情的方式。顺便说一句,-d 会做什么?
  • 我正在使用蚂蚁。我将添加ant脚本如下:
  • 你真的需要从另一端开始工作 - “用刀调试,而不是步枪”。换句话说,不要试图猜测哪里出了问题,而是想办法收集更多信息来解决问题。通过实验切断可能的原因空间。例如, 中是否会出现问题?试着把它拿出来,看看你是否会在有清洁和没有清洁的情况下得到同样的战争。好的战争和坏的战争在规模和其他特征上有何区别?在构建好的和坏的构建后复制 build.dir 的内容,然后比较它们。有什么不同?

标签: java tomcat ant zip javac


【解决方案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>

然后一切正常。

【讨论】:

    【解决方案2】:

    谷歌搜索该异常消息表明这是由于您(Tomcat)试图读取的 ZIP 文件损坏所致。要找出它损坏的原因,我们需要有关您如何构建 WAR 文件的更多信息。

    【讨论】:

    • 我用谷歌搜索并找到了。正如我在原帖中所说的编译项目的问题。以前,我正在获取有关“javac”中正在发生的事情的信息,但现在当我重新编译时,我什么也没得到。 PS:我没有更改 build.xml 和源代码文件。
    【解决方案3】:

    我会尝试摆脱被 clean 删除的各种构建工件集,以查看导致问题的原因。希望这将提供足够的洞察力来解决问题。

    【讨论】:

    • 如果你想看看,我已经添加了 build.xml。
    【解决方案4】:

    Ant 的编译器任务是智能的,如果它检测到输出类比源类更新,那么编译器会得出结论,该类肯定是已经从源代码构建的。在这种情况下,编译器不会做任何事情(因为工作已经被检测到要完成)。

    当编译器什么都不做时,就没有输出了。

    第一次编译后,打开一个源文件,做一些小改动(例如注释),然后保存文件。这将使源代码比现有的编译类更新。然后当你调用 Ant 任务来构建类时,javac 任务会检测到源比那个类更新,它会重新编译源文件生成新的类文件。

    既然 javac 任务会做某事,那么它就会有东西要报告;因此,您应该会看到一些输出(但比必须构建所有内容时要少)。

    【讨论】:

    • 如果你想看看,我已经添加了 build.xml。
    • 正如我在帖子中所说的那样。我得到了一些信息,现在它没有,我相信这是 ZipException 的根本问题。如果您不认为 ZipException 不是由此引起的,那么您认为是什么问题?
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    相关资源
    最近更新 更多