2014-12-18 57 views
15

Tôi đang sử dụng Spring Boot với bootRepackage gradle để xây dựng tệp jar phát hành. Dự án của tôi cần mã obfuscator trước khi giao cho khách hàng. Tôi đã thử proguard và một số công cụ khác nhưng nhiều vấn đề xảy ra. Tôi có thể có lời khuyên làm thế nào để cấu hình các công cụ như vậy cho khởi động mùa xuân.Bộ khởi động mùa xuân obfuscator

tôi đã cố gắng ProGuard với những cấu hình

-injars ./build/libs/webservice-1.0.jar 
-outjars ./build/libs/webservice-obs-1.0.jar 
-libraryjars <java.home>/lib/rt.jar 
-keep class !myapplicationpackage.** { *; } 
-keep class myapplicationpackage.Application { *; } 

-ignorewarnings 
-keepdirectories ** 
-dontshrink 
-keepattributes *Annotation* 

-keepclassmembers class com.yumyumlabs.** { java.lang.Long id; } 
-keepnames class com.yumyumlabs.** implements java.io.Serializable 

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


-keepclassmembers class * { 
    @org.springframework.beans.factory.annotation.Autowired *; 
    @org.springframework.beans.factory.annotation.Qualifier *; 
    @org.springframework.beans.factory.annotation.Value *; 
    @org.springframework.beans.factory.annotation.Required *; 
    @org.springframework.context.annotation.Bean *; 
    @javax.annotation.PostConstruct *; 
    @javax.annotation.PreDestroy *; 
    @org.aspectj.lang.annotation.AfterReturning *; 
    @org.aspectj.lang.annotation.Pointcut *; 
    @org.aspectj.lang.annotation.AfterThrowing *; 
    @org.aspectj.lang.annotation.Around *; 
} 
-keep @org.springframework.stereotype.Service class * 
-keep @org.springframework.stereotype.Controller class * 
-keep @org.springframework.stereotype.Component class * 
-keep @org.springframework.stereotype.Repository class * 
-keep @org.springframework.cache.annotation.EnableCaching class * 
-keep @org.springframework.context.annotation.Configuration class * 
-keepattributes Signature 

-dontwarn com.yumyumlabs.web.controllers.auth.AuthController 



-dontwarn com.google.apphosting.api.ReflectionUtils 
-dontwarn sun.misc.Unsafe 




-dontwarn org.tartarus.snowball.** 
-dontnote 

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault 

Nhưng tạo jar không thể chạy

java.lang.IllegalStateException: Unable to open nested entry 'lib/spring-boot-starter-web-1.2.0.RELEASE.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file 
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(Unknown Source) 
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(Unknown Source) 
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(Unknown Source) 
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(Unknown Source) 
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(Unknown Source) 
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(Unknown Source) 
at org.springframework.boot.loader.Launcher.launch(Unknown Source) 
at org.springframework.boot.loader.JarLauncher.main(Unknown Source) 
+2

Vui lòng giải thích chi tiết hơn những gì bạn đã thử và những vấn đề bạn có, để chúng tôi có thể giúp bạn giải quyết những vấn đề này. – Jesper

+0

Vấn đề rất đơn giản nếu bạn có một cái lọ có phụ thuộc lồng nhau và cố gắng làm xáo trộn với proguard, nó sẽ nén các lọ lồng nhau và bộ nạp khởi động lò xo không thể nạp các lọ đó. – telebog

+0

Bạn có quản lý để làm xáo trộn ứng dụng Spring-Boot của mình không? – Modi

Trả lời

1

Đó là nói cho bạn vấn đề này. Nó đang nén các tệp JAR được nhúng không được phép. Bạn cần phải làm cho nó bỏ qua việc nén các phần tử con. Có lẽ tốt nhất để bỏ qua nén hoàn toàn.

Thực sự bạn có thể bỏ qua tất cả vì điều này khiến cho kỹ sư đảo ngược khó hơn một chút, nhưng không dừng lại. Nếu bạn thực sự cần phải giữ bí mật rằng xấu thì lựa chọn thực sự duy nhất của bạn là bán ứng dụng của bạn dưới dạng dịch vụ thay vì cung cấp JAR, WAR, EAR, v.v.

IllegalStateException: Không thể mở lồng nhau mục 'lib/spring -boot-starter-web-1.2.0.RELEASE.jar '. Nó đã được nén và các tệp jar lồng nhau phải được lưu trữ mà không cần nén. Vui lòng kiểm tra cơ chế được sử dụng để tạo tệp jar thực thi của bạn

1

Điều này có thể được thực hiện bằng cách đóng gói lại thư viện chưa nén. Điều này có thể được thực hiện bằng cách sử dụng công cụ jar với kịch bản bash sau đây. Kịch bản lệnh đơn giản phải được thực hiện trong thư mục chính của dự án.

# some constant settings we use 
work_dir=work 
uncompress_dir=uncompress 
library_dir=lib 

# parameters for input and output files 
# the name of the library that should be uncompressed 
library_name="spring-boot-starter-web-1.2.0.RELEASE.jar" 
# the obfuscated artifact 
original_jar='webservice-obs-1.0.jar' 
# the new obfuscated artifact (can be the same) 
repacked_jar='webservice-obs-repack-1.0.jar' 

# build the obfuscated library 
mvn clean package -Dobfuscation 

# create working directory and copy obfuscated artifact 
mkdir target/$work_dir 
cp target/$original_jar target/$work_dir 
cd target/$work_dir 

# extract contents of obfuscated artifact 
jar xvf $original_jar 
rm $original_jar 

# uncompress the target library and jar again without compression (c0) 
mkdir $uncompress_dir 
mv $library_dir/$library_name $uncompress_dir 
cd $uncompress_dir 
jar xvf $library_name 
rm $library_name 
jar c0mf ./META-INF/MANIFEST.MF $library_name * 
mv $library_name ../$library_dir 
cd .. 
rm -r $uncompress_dir 

# jar the complete obfuscated artifact again 
# it is important here to copy the manifest as otherwise the library would not be executeable any more by spring-boot 
jar c0mf ./META-INF/MANIFEST.MF ../$repacked_jar * 

# cleanup work dir 
cd .. 
rm -r $work_dir 

Có thể bạn phải thực hiện lại việc này nếu có thêm tệp cần xử lý đặc biệt này. Một trong những thư viện làm điều này là ví dụ như thạch anh.

Các vấn đề liên quan