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" />
抱歉...还没有看到您要添加的部分... 试试这样:
include name= "builds/temp/_XA.class" />
【讨论】:
尝试在javac
或jar
上使用许多选项,但这不起作用: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文件中