[SPRING] 스프링 부트 obfuscator
SPRING스프링 부트 obfuscator
릴리스 jar 파일을 빌드하려면 bootRepackage gradle과 함께 Spring Boot를 사용하고 있습니다. 내 프로젝트는 고객에게 전달하기 전에 코드를 혼란스럽게해야합니다. 나는 프로 가드와 다른 도구를 시도했지만 많은 문제가 발생합니다. 스프링 부트 용 도구를 구성하는 방법에 대한 조언을받을 수 있습니까?
나는이 설정으로 ProGuard를 시도했다.
-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
하지만 생성 된 jar cant run
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)
해결법
-
==============================
1.그것은 당신에게 문제를 말하고 있습니다. 그것은 허용되지 않는 임베디드 JAR 파일을 압축합니다. 자식 요소의 압축을 건너 뛰려면이 파일을 가져와야합니다. 압축을 완전히 건너 뛰는 것이 가장 좋습니다.
그것은 당신에게 문제를 말하고 있습니다. 그것은 허용되지 않는 임베디드 JAR 파일을 압축합니다. 자식 요소의 압축을 건너 뛰려면이 파일을 가져와야합니다. 압축을 완전히 건너 뛰는 것이 가장 좋습니다.
리버스 엔지니어링을 조금 더 어렵게 만들었으므로 실제로 모든 것을 건너 뛸 수는 있지만 중지하지는 않습니다. 정말로 비밀로 유지해야하는 경우 JAR, WAR, EAR 등을 제공하는 대신 서비스로 서비스를 판매하는 것이 유일한 유일한 방법입니다.
IllegalStateException : 중첩 항목 'lib / spring-boot-starter-web-1.2.0.RELEASE.jar'을 열 수 없습니다. 압축되고 중첩 된 jar 파일은 압축없이 저장해야합니다. 실행 가능한 jar 파일을 만드는 데 사용 된 메커니즘을 확인하십시오.
-
==============================
2.이것은 압축되지 않은 라이브러리를 다시 포장하여 수행 할 수 있습니다. 다음 bash 스크립트로 jar 도구를 사용하여 수행 할 수 있습니다. 이 스크립트는 프로젝트 메인 디렉토리에서 실행되어야합니다.
이것은 압축되지 않은 라이브러리를 다시 포장하여 수행 할 수 있습니다. 다음 bash 스크립트로 jar 도구를 사용하여 수행 할 수 있습니다. 이 스크립트는 프로젝트 메인 디렉토리에서 실행되어야합니다.
# 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
아마도 더 많은 파일에이 특별한 처리가 필요한 경우이 작업을 다시 수행해야 할 것입니다. 이를 수행하는 라이브러리 중 하나가 예를 들어 석영입니다.
from https://stackoverflow.com/questions/27542110/spring-boot-obfuscator by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring REST 컨트롤러를 테스트 할 때 @AuthenticationPrincipal 삽입 (0) | 2019.04.16 |
---|---|
[SPRING] @ComponentScan을 Spring의 테스트 특정 컨텍스트 구성과 함께 사용하는 방법 Junit4 TestRunner? (0) | 2019.04.16 |
[SPRING] 스프링 애플리케이션 컨텍스트 이벤트를 다른 컨텍스트로 연결하는 방법 (0) | 2019.04.16 |
[SPRING] Mockito @ InjectMocks는 어떻게 작동합니까? (0) | 2019.04.15 |
[SPRING] Spring Social Facebook : "OAuth2 'state'매개 변수가 일치하지 않습니다." (0) | 2019.04.15 |