【问题标题】:Ant build failed with compile failed after I replace a .class file in one dependency jar在我替换一个依赖项 jar 中的 .class 文件后,Ant 构建失败并编译失败
【发布时间】:2019-02-01 17:17:59
【问题描述】:

我是 Ant 新手,目前有一个新的 Java Web 应用程序构建需要支持,一个 Web 应用程序依赖于 b Web 应用程序并将其作为 JAR 依赖项添加到 lib 文件夹中,所以如果有一些更新在 b 上,然后我需要重建 b 并生成一个新的 JAR,然后替换 a 的依赖项。

就像我说的那样,我在 b 应用程序的一个 Java 文件中更改了一些代码,然后编译它,然后我解压缩依赖 b JAR 以替换该类文件并将其重新压缩为 JAR 文件。当我构建它时,出现错误并显示编译失败。

这两个基于JDK1.6的java应用程序,加上我还检查jar文件的源代码是JDK 1.6,所以我使用JDK 1.6编译它javac updatedJava.java,还有一件事是,如果我不替换这个类文件,它可以在 Jenkins 中成功构建,而一旦我更新该类文件,它就会失败。

我对 Ant 真的不熟悉。这是我的应用程序详细信息和一些错误日志:

应用架构:

A 
 |-src
 |-web 
     |- WEB-INFO
          |- web.xml
          |- lib
             |- B.jar
 |- webex-build.xml

B
  |- src
      |- updatedJar.java
  |- build
      |- classes
  |- target
      |- B.jar

A 的 ant 构建文件:

<project name="A" default="war" basedir="."> 
 
  <property file="../build.properties"/> 
 
  <property name="version" value="1.0"/> 
  <property name="dir.root" value="."/> 
  <echo>#####################################################################</echo> 
  <echo>#       Building ${ant.project.name} Version is ${version}</echo> 
  <echo>#####################################################################</echo> 
     
  <!--property name="WL_HOME" value="D:/bea" /--> 
  <property name="app.lib" value="web/WEB-INF/lib" /> 
  <property name="server.lib" value="${wl.home}/server/lib"/> 
  <property name="modules.lib" value="${bea.home}/modules" /> 
  <property name="configfile_env" value="web_message_${env}.properties" /> 
  <!-- set local properties for this build --> 
  <path id="lib.classpath"> 
      <fileset dir="${app.lib}">  
             <include name="*.jar"/>  
      </fileset> 
    <pathelement location="${modules.lib}/javax.servlet_1.0.0.0_2-5.jar"/> 
    <pathelement location="${server.lib}/ojdbc6.jar"/> 
  </path> 
<property name="build" value="build"/> 
<property name="src" value="src/java"/> 
<property name="config" value="src/configsrc/"/> 
<property name="srcjaxws" value="src/jaxwssource"/> 
<property name="adapter" value="src/adapter"/>
<property name="reports.junit.xml.dir" value="junit/reports"/>
<property name="project.test.java.dir" value="src/test"/>
<property name="project.target.dir" value="target"/>
 
  <target name="init"> 
    <tstamp/> 
    <delete dir="${build}"/> 
    <mkdir dir="${build}"/> 
  </target> 
 
  <target name="compile" depends="init"> 
    <mkdir dir="${build}/classes"/> 
    <javac destdir="${build}/classes" debug="on" includeantruntime="false"> 
      <src path="${srcjaxws}"/> 
      <src path="${src}"/>  
      <src path="${adapter}"/>
      <classpath refid="lib.classpath"/> 
      <compilerarg value="-Xlint"/> 
    </javac> 
      <copy todir="${build}/classes/" overwrite="true" preservelastmodified="true" failonerror="true" verbose="true" flatten="false"> 
          <fileset dir="${config}"/> 
      </copy> 
      <!--if> 
                  <isset property="env" /> 
                  <then> 
                      <echo>ENV is set as ${env}</echo> 
                      <copy tofile="${build}/classes/config/system/web_message.properties" file="${build}/classes/config/config_env/web_message_${env}.properties" overwrite="true" /> 
                  </then> 
                  <else> 
                      <echo>There is no env set, if you want to set, please use -Denv=dev/qa/devint/pp/prod</echo> 
                  </else> 
              </if--> 
  </target> 
	
  <target name="test" depends="compile">
			<echo message="Testing..."/>
  			<delete dir="${project.target.dir}" />
			<delete dir="${reports.junit.xml.dir}" />
  			<mkdir dir="${project.target.dir}" />
			<mkdir dir="${reports.junit.xml.dir}" />

			<javac destdir="${build}/classes" debug="true" includeantruntime="false">
				<src path="${project.test.java.dir}"/>
				<classpath>
					<path refid="lib.classpath"/>
				</classpath>
				<classpath path="${build}/classes" />
			</javac>

	        <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
	            <classpath>
	                <path refid="lib.classpath"/>
	            </classpath>
	        </taskdef>
			
	        <!-- Import the JaCoCo Ant Task -->
	        <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
	            <!-- Update the following line, or put the "jacocoant.jar" file in your "$HOME/.ant/lib" folder -->
	            <classpath path="${app.lib}/jacocoant.jar" />
	        </taskdef>
  	
  	 <!-- Run your unit tests, adding the JaCoCo agent -->
  	         <jacoco:coverage destfile="${project.target.dir}/jacoco-unit.exec" xmlns:jacoco="antlib:org.jacoco.ant">
  	          <junit fork="yes" failureProperty="test.failed">
  	             <classpath refid="lib.classpath" />
  	             <classpath location="${build}/classes" />
  	             <classpath location="${build}" />

  			<formatter type="xml" />
  	             <batchtest todir="${reports.junit.xml.dir}">
  	              <fileset dir="${build}/classes">
  	                 <include name="**/*Test.class" />
  	              </fileset>
  	             </batchtest>
  	          </junit>
  	 		</jacoco:coverage>    

			<echo message="Test completed..."/>
</target>
 
  <target name="war" depends="compile"> 
    <mkdir dir="${build}/wls10"/> 
    <wars classes-dir="${build}/classes" build-dir="${build}"/> 
  </target> 
 
  <macrodef name="wars"> 
    <attribute name="classes-dir"/> 
    <attribute name="build-dir"/> 
    <sequential> 
      <war-task classes-dir="@{classes-dir}" build-dir="@{build-dir}" generic="javaee5" appserver="wls10"/> 
    </sequential> 
  </macrodef> 
 
  <macrodef name="war-task"> 
    <attribute name="classes-dir"/> 
    <attribute name="build-dir"/> 
    <attribute name="generic"/> 
    <attribute name="appserver"/> 
    <sequential> 
      <war destfile="@{build-dir}/@{appserver}/WebexPFProxyWS.war" webxml="web/WEB-INF/web.xml"> 
        <classes dir="@{classes-dir}"></classes> 
        <webinf dir="web/WEB-INF" includes="web*.xm*"/> 
         
        <manifest></manifest> 
        <lib dir="${app.lib}"> 
            <include name="*.jar"/> 
        </lib> 
        
       <webinf dir="web/WEB-INF" includes="wsdl/**"/> 
        
       <fileset dir="web"> 
            <include name="**/*.jsp"/> 
        </fileset> 
        
        
      </war> 
    </sequential> 
  </macrodef> 
 
</project> 

执行ant build时Jenkins的错误日志:

第 41 行是上面 xml 中的 &lt;javac destdir="${build}/classes" debug="on" includeantruntime="false"&gt;

[exec] [javac] XMLSerializer serializer = getXMLSerializer(writer, null);
[exec] [javac] ^
[exec] [javac] Note: Some input files additionally use unchecked or unsafe operations.
[exec] [javac] 100 errors
[exec] [javac] 116 warnings
[exec] 
[exec] BUILD FAILED
[exec] /apps/dftjenkins/jenkins_node/workspace/java/A/webex-build.xml:41: Compile failed; see the compiler error output for details.
[exec] 
[exec] Total time: 3 seconds

BUILD FAILED
/apps/dftjenkins/JENKINS_HOME_NODES/selfservices-build-scripts-stash/Proxy/build_ht.xml:149: The following error occurred while executing this line:
/apps/dftjenkins/JENKINS_HOME_NODES/selfservices-build-scripts-stash/Common/build_process.xml:517: The following error occurred while executing this line:
/apps/dftjenkins/JENKINS_HOME_NODES/selfservices-build-scripts-stash/Common/build_common.xml:179: The following error occurred while executing this line:
/apps/dftjenkins/JENKINS_HOME_NODES/selfservices-build-scripts-stash/Common/build_common.xml:182: exec returned: 1

Total time: 7 seconds
Build step 'Invoke Ant' marked build as failure
Running post build processes

【问题讨论】:

    标签: java jenkins ant


    【解决方案1】:

    当类路径中有一个无效的 jar 时,它会被静默忽略。鉴于您收到大量构建错误,听起来好像正在发生这种情况:您的代码依赖于该 jar 中的类,并且该 jar 有效地消失了,因为它是无效的。

    特别是在早期的 java 版本中,“jar 只是一个 zip 文件”并不是真的:虽然 unzip 可以成功解压缩 jar,但您使用“zip”工具生成的任何旧 zip 文件都不一定是有效的 jar。

    我首先使用 jar 工具(而不是 zip)来添加/替换类文件。

    【讨论】:

    • 嗨@rzwitserloot,正如你所说,你用什么工具来做这件事,有什么建议吗?谢谢
    • 'jar'。它在 javac 旁边。
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2022-01-18
    • 2021-02-02
    • 2021-12-26
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多