ANT - 我如何无法将文件移动到 JAR

Posted

技术标签:

【中文标题】ANT - 我如何无法将文件移动到 JAR【英文标题】:ANT - How i cant move File to JAR 【发布时间】:2014-05-01 18:40:04 【问题描述】:

我已经编辑了我的 ANT 构建过程。这是我的工作清单:

创建src 文件夹的副本和一个自写的 AntTask 混淆所有字符串 ANT 使用<jar> 创建一个 JAR JAR 将被ProGuard 混淆 必须将附加文件复制到 JAR JAR 将被签名

bodled 步骤是我的问题。我如何将单个文件复制到 JAR 的根目录。我必须在这里迈出这一步!之前或之后都不起作用: 之前:ProGuard 将尝试混淆这个文件并给出异常。不能工作后,文件必须签名。

有人有聪明的主意吗?

这是我的 ANT 构建脚本的缩小版本:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<project basedir="." default="default" name="DEMO">
    <property environment="env" />
    <property name="debuglevel" value="source,lines,vars" />
    <property name="target" value="1.7" />
    <property name="source" value="1.7" />

    <!-- Applet Informationen -->
    <property name="version" value="1.0.0" />

    <!-- Start Build process -->
    <target name="default">
        <echo message="Copy source" />
        <delete dir="builds/temp/" />
        <mkdir dir="builds/temp/" />
        <copydir src="src" dest="builds/temp/" />

        <echo message="Obfuscate Strings" />
        <taskdef resource="task.properties" classpath="libs/MyStringHelper.jar" />
        <mystringhelper dir="builds/temp/" name="_X.class" decoder="MyClass.myMethod" imports="import test.MyClass;" />
        <javac srcdir="builds/temp/" destdir="bin" />
        <sleep seconds="1" />

        <echo message="Create JAR Archive with Version $version" />
        <jar destfile="builds/$name$version.jar" basedir="bin">
            <manifest>
                <attribute name="Application-Name" value="$name" />
                <attribute name="Application-Library-Allowable-Codebase" value="*.domain.com localhost" />
                <attribute name="Caller-Allowable-Codebase" value="*.domain.com localhost" />
                <attribute name="Codebase" value="*.domain.com localhost" />
                <attribute name="Permissions" value="all-permissions" />
                <attribute name="Author" value="Adrian Preuss" />
                <attribute name="Main-Class" value="main.Run" />
            </manifest>
        </jar>

        <echo message="Obfuscate the Archive" />
        <taskdef resource="proguard/ant/task.properties" classpath="libs/proguard.jar" />

        <proguard printmapping="proguard.map" overloadaggressively="off" repackageclasses="" renamesourcefileattribute="SourceFile">
            <injar file="builds/$name$version.jar" />
            <outjar file="builds/__$name$version.jar" />
            <libraryjar file="$java.home/lib/rt.jar" />
            <libraryjar file="libs/ant.jar" />
            <libraryjar file="libs/gradle-plugins-1.3.jar" />
            <libraryjar file="libs/gradle-base-services-1.3.jar" />
            <libraryjar file="libs/gradle-core-1.3.jar" />
            <libraryjar file="libs/groovy-all-1.8.6.jar" />
            <libraryjar file="libs/kenv.zip" />

            <keeppackagename name="main" />
            <keep access="public" name="main.Run">
                <method access="public" type="void" name="changeLanguage" parameters="java.lang.String" />
            </keep>
        </proguard>

        <delete file="builds/$name$version.jar" failonerror="false" />
        <move file="builds/__$name$version.jar" tofile="builds/$name$version.jar" />

        <!--

            ##
            ##    ADD the File "builds/temp/_XA.class" to the JAR
            ##
            ##    Info: the _XA.class is'nt an Java-Class file!

        -->

        <echo message="Roll up the code signing" />
        <signjar jar="builds/$name$version.jar" alias="$name" keystore="$name.keystore" storepass="$password" preservelastmodified="true" />

        <echo message="Verify code signing" />
        <verifyjar jar="builds/$name$version.jar" alias="$name" storepass="$password"/>

        <echo message="Copy applet to local environment" />
        <copy file="builds/$name$version.jar" tofile="C:/devsrv/htdocs/$name$version.jar" failonerror="false" />

        <echo message="Cleanup,..." />
        <!-- .... -->
    </target>
</project>

【问题讨论】:

【参考方案1】:

这是我的 ant 构建文件的一部分,包括所有 xml、jpg、gif 和 png:

<!-- ============================================================== -->
<!-- Build application -->
<!-- ============================================================== -->
<target name="build" depends="make-bin-dir" description="Build application">
<javac srcdir="$src.dir" destdir="$bin.dir" debug="on" classpathref="javac.classpath" />
  <copy todir="$bin.dir">
    <fileset dir="$src.dir">
      <include name="**/*.xml" />
      <include name="**/*.jpg" />
      <include name="**/*.gif" />
      <include name="**/*.png" />
    </fileset>
  </copy>
</target>

要只包含一个文件,只需将全名输入include name= "fullnamehere" /&gt;

抱歉...还没有看到您要添加的部分... 试试这样:

include name= "builds/temp/_XA.class" /&gt;

【讨论】:

尝试在javacjar 上使用许多选项,但这不起作用:javac doesn't support the nested "copy" element. 编辑:等等,发现一个逻辑错误:) 嘿,它有效 :D 只有 ProGuard 还存在问题。 _XA.class 不是 Java 类。它是一个加密的文本文件。 没问题。但这就是proguard的问题。我不能说“不要碰_XA.class”。我需要在混淆处理之后添加这些 我认为这需要一个新帖子,因为没有人会在这个主题中寻找 ProGuard 错误 哦,好吧……有点理解错了。但是您可以编辑您的帖子并向我们展示您的错误。但我不知道 ProGuard。祝你好运。【参考方案2】:

由于 Jar 确实是一个 Zip 文件,您可以在 proguard 完成操作后将 jar 解压缩到临时目录,在该临时目录中添加您想要的 _XA.class 文件,然后重新创建之前的 jar 文件签名。

【讨论】:

不需要解压。是的 JAR 文件是 ZIP 档案。但是您可以在不解压缩的情况下添加文件;)

以上是关于ANT - 我如何无法将文件移动到 JAR的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ - 添加依赖jar后,如何使用Jar中的方法

xml 如何使用Ant将Java程序捆绑到单个可执行.jar文件中

如何在 gitlab 中的作业之间移动 jar 文件?

如何引用公共目录(不是库)中的外部 jar 文件来使用 ant 构建 android 项目?

无法将移动应用跟踪绑定添加到我的项目

在旧的 Ant 项目中添加 Ivy