МЕДЛЕННО, как избежать этого при каждой сборке и повысить производительность кэша пути ivy? - PullRequest
0 голосов
/ 05 декабря 2018

Время компиляции сокращается на 4 секунды при разрешении зависимых библиотек для моего javac шага при каждой сборке в этой строке:

    <target name="compile" depends="bootstrap">
        <ivy:cachepath pathid="classpath"/> <!-- SLOW -->

Я хочу по существу кэшировать результаты ivy:cachepath, поэтому у меня нетделать это каждый билд.Я хочу, чтобы ${classpath} существовал менее чем за 0,2 секунды

Контекст: Это ванильный муравей build.xml, который загружает ivy, использует файл ivy.xml, в котором перечислены стандартные зависимости maven, а затем вызывает javac сэти библиотеки в пути к классам)

    <property name="ivy.install.version" value="2.4.0"/>
    <property name="ivy.jar.dir" value="${basedir}/ivy"/>
    <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"/>
    <property name="build.dir" value="build"/>
    <property name="src.dir" value="src"/>
    <target name="bootstrap" description="--> install ivy">
        <path id="ivy.lib.path">
            <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
        </path>
        <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
    </target>

    <!-- Download any missing libs -->
    <target name="install" depends="bootstrap">
        <!-- install ivy.jar -->
        <mkdir dir="${ivy.jar.dir}"/>
        <echo message="installing ivy..."/>
        <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" dest="${ivy.jar.file}" usetimestamp="true"/>
        <!-- Downloads all the libraries from maven central via ivy.xml and saves them to classpath-->
        <ivy:settings file="ivysettings.xml"/>
        <ivy:resolve/>
        <ivy:retrieve sync="true"
                      type="jar,bundle"/>
        <ivy:cachepath pathid="classpath"/>
    </target>

  <target name="clean" depends="bootstrap">
        <delete dir="${build_dir}"/>
        <delete dir="./lib"/>
        <delete dir="./bin"/>
        <ivy:cleancache/>
  </target>


    <!-- Compile -->
    <target name="compile" depends="bootstrap">
        <ivy:cachepath pathid="classpath"/>
        <ivy:settings file="ivysettings.xml"/>
        <mkdir dir="${build_dir}"/>
        <javac encoding="ISO-8859-1"
               includeantruntime="false"
               srcdir="${src_dir}"
               destdir="${build_dir}"
               classpathref="classpath"
               debug="on">
            <!--<withKotlin/> &lt;!&ndash; If this is undefined, run "Build" target first. &ndash;&gt;-->
        </javac>
        <!--<kotlinc src="${src_dir}/TestSuite/TestSuite.java" output="${build_dir}/${jar_name}.jar"/>-->

        <delete file="${dist_dir}/${jar_name}.jar"/>

        <pathconvert property="classpath.name" pathsep=" ">
            <path refid="classpath" />
            <mapper>
                <chainedmapper>
                    <flattenmapper />
                    <globmapper from="*.jar" to="../lib/*.jar" />
                </chainedmapper>
            </mapper>
        </pathconvert>

        <echo message="classpath.name : ${classpath.name} " />
        <jar destfile="bin/${jar_name}.jar" basedir="build" includes="**/*.class lib/*">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
                <attribute name="Class-Path" value="${classpath.name}"/>
            </manifest>
        </jar>
    </target>

1 Ответ

0 голосов
/ 05 декабря 2018

Это, вероятно, глупый способ сделать это, но я просто перебил решение, записав classpath на диск и сократив время сборки пополам:

Запись через:

    <pathconvert property="classpath">
        <path refid="classpath" />
    </pathconvert>
    <propertyfile file="my.properties" comment="My properties">
        <entry key="classpath" value="${classpath}"/>
    </propertyfile>

Читать через:

    <loadproperties srcFile="my.properties"/>

Использовать через:

    <javac classpath="${classpath}" ... >

Возможно, это было даже быстрее с задачей <echo file=

...