apache ant编译资源不足

最近生产程序有个公共包内有900多个文件,使用JDK1.6打包可以顺利打出jar,目前需要升级到1.8,然后就打包提示 java.lang.StackOverflowError,具体部分信息如下:

compile:
     [echo] +---------------------------------------------------+
     [echo] | C O M P I L I N G    S O U R C E S                |
     [echo] +---------------------------------------------------+
    [javac] E:\workspace\RE_PSS_XX\build.xml:61: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 395 source files to E:\workspace\RE_PSS_XX\classes
    [javac] 系统资源不足。
    [javac] 有关详细信息, 请参阅以下堆栈跟踪。
    [javac] java.lang.StackOverflowError
    [javac]     at com.sun.tools.javac.comp.Attr.attribArgs(Attr.java:668)
    [javac]     at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1816)
    [javac]     at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
    [javac]     at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)

Build.xml文件出错的一步是

 <!-- =================================================================== -->
    <!-- Compiles all the source code to build path                          -->
    <!-- =================================================================== -->
    <target name="compile" description="Compile all the source code.">
        <echo>+---------------------------------------------------+</echo>
        <echo>| C O M P I L I N G    S O U R C E S                |</echo>
        <echo>+---------------------------------------------------+</echo>
        <javac srcdir="${src.dir}" classpathref="project.class.path" destdir="${build.classes}" fork="yes" debug="on" />
    </target>

尝试一、修改编译命令

根据Javac命令格式,我们进行了添加内存大小、fork等的设置:

 <!-- =================================================================== -->
    <!-- Compiles all the source code to build path                          -->
    <!-- =================================================================== -->
    <target name="compile" description="Compile all the source code.">
        <echo>+---------------------------------------------------+</echo>
        <echo>| C O M P I L I N G    S O U R C E S                |</echo>
        <echo>+---------------------------------------------------+</echo>
        <javac fork="true" executable="D:\ProgramFiles\Java\jdk1.8.0_144\bin\javac" 
            srcdir="${src.dir}" memoryInitialSize="512m"  memorymaximumsize="1024m"
            destdir="${build.classes}" classpathref="project.class.path" debug="on" 
            deprecation="on"/> 
    </target>

然后问题依然没有解决;

尝试二、文件缩减拆包

排查策略:
1、采用减法策略,按各子模块包名进行删除,直到能顺利打包,定位问题的大致范围;
2、定位到某个模块,按实体对象进行,entity、dao、service的删除,并验证打包结果;
3、定位到某一个能影响打包结果的文件;
4、分析该文件,发现是个大表(栏位200个)的DaoImpl文件,比如自动化生成的 batchInsertPerApp(final List<PerApp> list)有1000行,注释掉改方法,打包顺利通过;
5、发现问题是出在大文件的巨型方法上,查找其他类似问题,逐个解决;

经过删减非必须的冗余文件,并修改超大方法以后,包顺利打出;

遗留问题:

JDK1.6和1.8在大文件打包上存在差异,具体原因待排查,有类似的同学可以留言交流;

附参考资料

# 相关Javac的网文资料摘要:

<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac destdir="build/classes" debug="on" fork="true"  memoryInitialSize="512m"  memorymaximumsize="500M source="1.5" target="1.5" deprecation="on"  >
<!-- srcdir 源目录(在这里为源代码目录)destdir目标目录 即编译完成后存放class文件的目录 -->
<src path="src"/>
<src path="eventinfo"/>
</javac>
</target>

fork

是否执行外部的javac

如果没有制定fork属性默认为false javac和ant命令将在同一个进程中执行 容易出现内存溢出 同时javac被分配的内存只有64MB,如果指定fork属性为true,javac命令将和ant不在同一个进程中执行,分配内存的大小将为
memoryinitialsize(获得基本vm初始内存大小)、memorymaximumsize(最大内存大小)指定的大小。

source:指定版本号使编译出的(文件)类兼容该版本

一般jdk都向下兼容向上不兼容 source在这里指编译出向下兼容的版本的类
如果用Eclipse,你可以在项目属性中编译选项里有设置生成兼容JDK1.4的类。但是如果你在Eclipse里自己写Ant脚本用<javac> 命令去编译java类,则生成的仍为JDK1.5的类(执行Ant脚本时与Eclipse设置的编译选项无关)。如何解决了,其实很简单,只要在<javac> ant 命令里加source参数。

target:根据指定的vm版本生成class文件

<target name="main3">  
<delete dir="${class.dir}"/>  
<mkdir dir="${class.dir}"/>  
<javac fork="true" executable="D:\Java\jdk1.5.0_10\bin\javac" srcdir="${src.dir}" destdir="${class.dir}">  
<classpath refid="classpath" />  
</javac>  
</target>  

为javac 任务指定fork和executable,是用指定编译器编译,这个方法更灵活,您甚至可以指定非sun公司的java编译器

 <target name="-compile">
       < javac srcdir="${srcdir}"  destdir="${builddir}" fork="true" memorymaximumsize="500M" includes="**/*.java" classpathref="class_path">
            <compilerarg value="-Xlint:unchecked"/>             
        </javac>
    </target>
<javac 
  srcdir="@{srcdir}" 
  destdir="@{destdir}"
  includeantruntime="@{includeantruntime}"
  debug="@{debug}" 
  deprecation="@{deprecation}" 
  target="@{target}"
  source="@{target}"
  fork="@{fork}" 
  executable="@{executable}"
  memoryInitialSize="@{memoryInitialSize}"
  memoryMaximumSize="@{memoryMaximumSize}">
  <compilerarg compiler="${build.compiler}" line="${build.compiler.args}"/>
  <javac-elements/>
</javac>

Jard打包

<jar destfile="${webRoot}/${ash_jar}" level="9" compress="true" encoding="utf-8" basedir="${dest}">
    <manifest>
        <attribute name="Implementation-Version" value="Version: 2.2"/>
    </manifest>
</jar>

ant编译项目出现 [javac] 系统资源不足
https://www.cnblogs.com/huige-you/p/3726770.html

ant教程
https://www.w3cschool.cn/ant/vynj1hwi.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341