2012-01-23 2 views
3

У меня есть веб-приложение с помощью пружинных аннотаций extensivley и у меня есть моя конфигурация ProGuard как следующее:испытывающие трудности борьбы 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

Можете ли вы создать нить-дамп, используя 'jstack' или' JVisualVM' во время ожидания? Кроме того, возможно, браузер молча регистрирует некоторые ошибки? –

+2

Если вы работаете в unix/linux, вы можете сделать дамп потока, выпуская 'killall -QUIT java'. Дамп потока появится в 'catalina.out'. – Jonathan

+2

У вас есть .class файлы под WEB-INF/...? Последний раз, когда я разговаривал с разработчиком Proguard на форумах, Proguard не смог обработать внутри файла .war, распакованные файлы .class в WEB-INF (в com/yourcompany/yourpackage): он мог обрабатывать только файлы .jar. –

ответ

4

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

+3

Я очень застрял в аналогичная ситуация, с ситуацией, когда весна путает имя аннотированной реализации с его интерфейсом. Вероятно, запутывание закручивает аннотации. Это очень сложная сложная ситуация в отношении к моему боссу, который настаивает на обфускации. – Genjuro

+1

Вам нужно придумать новую технологию! – GingerHead

+1

@FrozenFlame, так что вы сделали? – GingerHead

2

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

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

Моим советом было бы отказаться от обфускации как плохая идея.

+1

В журналах ничего нет! starnge! – GingerHead

+2

Обфускатор, вероятно, настолько запутан, что система регистрации не инициализируется. –

+1

Это то, что я думаю, что log4j умирает под его процессом так плохо! но затмевать, потому что он должен работать в соответствии с тем, что я читаю от других, которые использовали proguard с весной! странно! – GingerHead

 Смежные вопросы

  • Нет связанных вопросов^_^