NetBeans集成ProGuard编译报错:jar不支持嵌套property元素
解决NetBeans中ProGuard集成的"jar不支持嵌套property元素"错误
问题诊断
你遇到的错误核心原因是Ant的<jar>任务不允许嵌套<property>、<taskdef>、<proguard>这类不属于它的子元素。看你的build.xml,你把ProGuard的配置、属性定义全部放在了<jar>标签内部,这违反了Ant任务的语法规则——<jar>只能包含与打包相关的子元素(比如<zipfileset>、<manifest>)。
解决方案
需要把ProGuard的处理逻辑从<jar>任务中抽离出来,调整-post-jar目标的执行顺序:
- 先配置ProGuard的路径并加载Ant任务
- 执行混淆操作生成混淆后的jar文件
- 再基于混淆后的jar,打包生成包含依赖库的最终jar
修正后的build.xml代码
<?xml version="1.0" encoding="UTF-8"?> <project name="AFB_CONEXIONES_DENTRO" default="default" basedir="."> <description>Builds, tests, and runs the project AFB_CONEXIONES_DENTRO.</description> <import file="nbproject/build-impl.xml"/> <target name="-post-jar"> <!-- 1. 配置ProGuard路径并加载Ant任务 --> <property name="proguard.jar.path" value="/home/y9c4db/Downloads/proguard6.1.1/lib/proguard.jar" /> <taskdef resource="proguard/ant/task.properties" classpath="${proguard.jar.path}" /> <!-- 2. 创建混淆输出目录 --> <mkdir dir="${build.dir}/obfuscated"/> <!-- 3. 执行ProGuard混淆 --> <echo message="Obfuscating ${dist.jar}..."/> <proguard printmapping="${build.dir}/obfuscated/${application.title}.map" renamesourcefileattribute="SourceFile" ignorewarnings="true"> <!-- Specify the input jars, output jars, and library jars. --> <injar file="${dist.jar}" /> <outjar file="${build.dir}/obfuscated/AFB_obfuscated.jar" /> <libraryjar path="${javac.classpath}" /> <libraryjar file="${java.home.path}/jre/lib/rt.jar" /> <!-- Keep some useful attributes. --> <keepattribute name="InnerClasses" /> <keepattribute name="SourceFile" /> <keepattribute name="LineNumberTable" /> <keepattribute name="Deprecated" /> <keepattribute name="*Annotation*" /> <keepattribute name="Signature" /> <!-- Preserve all public classes, and their public and protected fields and methods. --> <keep access="public"> <field access="public protected" /> <method access="public protected" /> </keep> <!-- Preserve all .class method names. --> <keepclassmembernames access="public"> <method type ="java.lang.Class" name ="class$" parameters="java.lang.String" /> <method type ="java.lang.Class" name ="class$" parameters="java.lang.String,boolean" /> </keepclassmembernames> <!-- Preserve all native method names and the names of their classes. --> <keepclasseswithmembernames> <method access="native" /> </keepclasseswithmembernames> <!-- Preserve the methods that are required in all enumeration classes. --> <keepclassmembers extends="java.lang.Enum"> <method access="public static" type="**[]" name="values" parameters="" /> <method access="public static" type="**" name="valueOf" parameters="java.lang.String" /> </keepclassmembers> <!-- Explicitly preserve all serialization members. --> <keepnames implements="java.io.Serializable"/> <keepclassmembers implements="java.io.Serializable"> <field access ="final" type ="long" name ="serialVersionUID" /> <field access ="!static !transient" name ="**"/> <field access ="!private" name ="**"/> <method access ="!private" name ="**"/> <method access ="private" type ="void" name ="writeObject" parameters="java.io.ObjectOutputStream" /> <method access ="private" type ="void" name ="readObject" parameters="java.io.ObjectOutputStream" /> <method type ="java.lang.Object" name ="writeReplace" parameters="" /> <method type ="java.lang.Object" name ="readResolve" parameters="" /> </keepclassmembers> </proguard> <!-- 4. 打包混淆后的jar + 依赖库 --> <jar jarfile="dist/AFB_con_librerias.jar"> <zipfileset src="${build.dir}/obfuscated/AFB_obfuscated.jar" excludes="META-INF/*" /> <zipfileset src="lib/ojdbc6.jar" excludes="META-INF/*" /> <zipfileset src="lib/log4j-1.2.17.jar" excludes="META-INF/*" /> <zipfileset src="lib/postgresql-9.2-1002.jdbc4.jar" excludes="META-INF/*" /> <manifest> <attribute name="Main-Class" value="${main.class}"/> </manifest> </jar> </target> </project>
关键修改说明
- 把
<property>、<taskdef>、<mkdir>、<proguard>全部移到了<jar>任务外部,确保每个Ant任务的子元素都是合法的 - 调整了混淆后的jar文件名(
AFB_obfuscated.jar),让逻辑更清晰 - 移除了
lib/proguard.jar的打包,因为ProGuard是混淆工具,不需要打包到最终应用jar中
内容的提问来源于stack exchange,提问作者absolute333
相关产品推荐
相关产品推荐

