С трудом справляюсь с весной - PullRequest
3 голосов
/ 23 января 2012

У меня есть веб-приложение, использующее пружинные аннотации extensivley, и у меня есть моя конфигурация proguard, подобная следующей:

-printmapping out.map

-dontoptimize

-keepdirectories

-renamesourcefileattribute SourceFile

-keepattributes Exceptions,SourceFile,LineNumberTable,*Annotation*

-adaptresourcefilenames    **.xsd,**.wsdl,**.xml,**.properties,**.gif,**.jpg,**.png
-adaptresourcefilecontents **.xsd,**.wsdl,**.xml,**.properties,META-INF/MANIFEST.MF 

-dontshrink

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean);
}

-keepclassmembers enum * {
    public static **[] values(); 
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve();
}

-keep @org.springframework.transaction.annotation.Transactional class *

-keep @org.springframework.stereotype.Service class *

-keep @org.springframework.stereotype.Controller class *

-keep @org.springframework.beans.factory.annotation.Autowired class *

-keep @org.springframework.web.bind.annotation.ResponseBody class *

-keep @org.springframework.web.bind.annotation.RequestMapping class *

-keep @org.springframework.stereotype.Repository class *

-keep @javax.annotation.Resource class *

-keep @javax.persistence.Entity class *

-keep @javax.persistence.Table class *

-keep @javax.persistence.Id class *

-keep @javax.persistence.GeneratedValue class *

-keep @javax.persistence.Column class *

-keep @javax.persistence.Transient class *

-keep @org.springframework.ws.server.endpoint.annotation.Endpoint class *

-keep @org.springframework.ws.server.endpoint.annotation.PayloadRoot class *

-keep @org.springframework.ws.server.endpoint.annotation.ResponsePayload class *

Оно прекрасно работает без каких-либо предупреждений.Но после развертывания в tomcat и открытия страницы в браузере она ждет и ждет без результата. В чем может быть проблема?

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

Я обнаружил проблему:
proguard не может обрабатывать аннотированные классы, методы, поля, особенно когда они являются типами времени выполнения.Если вы запустите proguard даже с опцией -keep для аннотаций, он все равно будет портиться с файлами конфигурации, поскольку может заменять только классы, методы, поля в ресурсах, которые имеют полную ссылку на пакет , т.е. если и только если класс / поле упоминается следующим образом: my.package.level.purpose.MyClass/my.package.level.purpose.MyClass.myField.
И, возвращаясь к аннотациям, веб-приложение spring полно аннотаций, поэтому оно будет бесполезнымили даже не запутан вообще (может быть, только классы утилит будут запутаны).
Заключение:
Нет смысла запутывать современную весну (3.x.x +) веб-приложения с любыми обфускаторами, даже коммерческими, потому что все они работают на стороне байт-кода и не будут обрабатывать аннотации и портить файлы конфигурации.

2 голосов
/ 23 января 2012

Вам нужно проверить файлы журнала сервера, чтобы увидеть, что происходит. Если в этом нет ничего плохого, изменение уровня ведения журнала на DEBUG даст вам гораздо больше информации о том, что делает Spring.

FWIW, я ожидаю, что Spring-приложение создаст вам массу проблем, если вы попытаетесь его запутать. Обработка DI и аннотаций Spring, вероятно, будет нарушена преобразованиями, которые обфускатор выполняет с файлами классов. Например, любое место, где аннотация ссылается на имя другого класса или метода, сломается, если обфускатор заменит имя класса / метода.

Мой совет - отказаться от запутывания как плохой идеи.

...