简体   繁体   English

java.lang.AbstractMethodError-使用ANT内置jar时

[英]java.lang.AbstractMethodError - while using ANT Built jar

I'm getting java.lang.AbstractMethodError for a specific case (only when I create a jar of my classes with ant) and I can't get my head around it. 我在特定情况下遇到java.lang.AbstractMethodError (仅当我用ant创建一罐我的类的罐子时),我无法解决这个问题。 Some help to understand this would be much appreciated. 一些帮助理解这一点将不胜感激。

Consider the following case (for some reason I've to keep the class hierarchy in my code as its below in example and I think doing so should not give me an AbstractMethodError in any case!): 考虑以下情况(由于某种原因,我必须在示例中将类层次结构保留在下面的示例中,我认为这样做无论如何都不应该给我AbstractMethodError!):

 public interface Cat {
     void speak();
 }

 public interface ColoredHeadCat extends Cat {
     boolean isColoredHead();
 }

 public interface RedHeadCat extends ColoredHeadCat {
     boolean isRedHead();
 }

 public interface SuperRedCat extends RedHeadCat {
     boolean isSuperCat();
 }

 public abstract class AbstractCat {
     public void speak() {
         System.out.println("Meow!");
     }
 }

 public abstract class AbstractColoredHeadCat extends AbstractCat {
     // .. Not overriding speak() method here

     public boolean isColoredHead() {
         return true;
    }
 }

 public abstract class AbstractRedHeadCat extends AbstractColoredHeadCat {
     // .. Not overriding speak() method here

     public boolean isRedHead() { 
         return true;
     }
 }

 public class SuperRedHeadCat extends AbstractRedHeadCat implements SuperRedCat {
     // .. Not overriding speak() method here too

     public  boolean isSuperCat() {
         return true;
     }
 }

 public class Main {
     public static void main(String[] arrgh) {
         SuperRedHeadCat superCat = new SuperRedHeadCat();
         superCat.speak(); // No exceptions! Works like charm.

         Cat cat = new SuperRedHeadCat();
         cat.speak(); // Gives java.lang.AbstractMethodError! Why?
     }
 }

All classes are in the same package. 所有类都在同一包中。

So the problem is I can't reproduce this through Eclipse: Everything runs perfectly. 因此,问题是我无法通过Eclipse进行复制:一切运行正常。 But after building a jar with ant , and then running 'Main' it throws AbstractMethodError . 但是在用ant构建一个jar之后,然后运行“ Main”,它将引发AbstractMethodError I'm out of ideas here about the reason for this behavior. 我对这种行为的原因不了解。

java -version Java版本

java version "1.6.0_27" Java版本“ 1.6.0_27”
Java(TM) SE Runtime Environment (build 1.6.0_27-b07) Java(TM)SE运行时环境(内部版本1.6.0_27-b07)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode) Java HotSpot(TM)64位服务器VM(内部版本20.2-b06,混合模式)

ant -version 蚂蚁版本

Apache Ant version 1.8.0 compiled on February 1 2010 Apache Ant版本1.8.0(于2010年2月1日编译)


PS: Except the Main class, remaining classes are obfuscated during ant build. PS:除Main类外,其余类在构建蚂蚁时会被混淆。
This problem is as resolved if I let AbstractCat implement Cat interface , AbstractColoredHeadCat implement ColoredHeadCat interface and AbstractRedHeadCat implement RedHeadCat interface. 如果我让AbstractCat实现Cat接口, AbstractColoredHeadCat实现ColoredHeadCat接口和AbstractRedHeadCat实现RedHeadCat接口,则可以解决此问题。

Which obfuscator are you using? 您正在使用哪个混淆器?

I tried with yguard and it works fine: 我尝试使用yguard,它工作正常:

<taskdef name="obfuscate" classname="com.yworks.yguard.YGuardTask"  classpath="c:/Soft/Java/yguard-2.5.3/lib/yguard.jar" />
<target name="obf" depends="jar">
    <obfuscate >
        <property name="error-checking" value="pedantic"/>
        <inoutpair in="target/cat.jar" out="target/obf.jar"/>

        <shrink >
            <property name="error-checking" value="pedantic"/>
            <keep>
                <method name="void main(java.lang.String[])" class="Main"/>
            </keep>
        </shrink>

        <rename mainclass="Main">
            <expose >
                <class classes="public" methods="public" fields="public">
                    <patternset>
                        <include name="**.*"/>
                        <exclude name="Main"/>
                    </patternset>
                </class>
            </expose>
        </rename>
    </obfuscate>
</target>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM