복붙노트

[SPRING] Proguard는 수업을 찾을 수 없다고 말하고 있습니다.

SPRING

Proguard는 수업을 찾을 수 없다고 말하고 있습니다.

나는 봄 mvc 응용 프로그램과 maven proguard를 사용하고 있습니다.

내 pom.xml 빌드 섹션은 다음과 같습니다.

<build>
        <finalName>myapp</finalName>
        <plugins>
           <plugin>
                <groupId>com.pyx4me</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <obfuscate>true</obfuscate>
                    <!--<options>-->
                        <!--<option>-keep public class</option>-->
                    <!--</options>-->
                    <injar>${project.build.finalName}</injar>
                    <injar>${project.build.finalName}</injar>
                    <inFilter>com.myapp.*</inFilter>
                </configuration>
            </plugin>
         </plugins>

나는 또한 시험했다 :

<injar>${project.build.finalName}.war</injar>

내가 달릴 때 :

mvn clean install

빌드 실패 메시지 :

[proguard] Reading program war [/Users/me/dev/git/myproject/myapp/target/myapp.war] (filtered)
 [proguard] Error: The input doesn't contain any classes. Did you specify the proper '-injars' options?

ERROR] Failed to execute goal com.pyx4me:proguard-maven-plugin:2.0.4:proguard (default) on project myapp: Obfuscation failed (result=1) -> [Help 1]

그것은 쇼 전에 메시지로 정확하게 내 항아리를 데리러 것으로 보인다 :

[INFO] --- proguard-maven-plugin:2.0.4:proguard (default) @ myapp ---
[INFO] execute ProGuard [-injars, '/Users/me/dev/gitserver/myproject/myapp/target/myapp.war'(!META-INF/maven/**,com.myapp.*), -outjars, '/Users/me/dev/git/myproject/myapp/target/myapp_pg.war', -libraryjars, ....

또한 어떤 옵션을 사용 하시겠습니까? 이것은 스프링 mvc이므로 다음과 같은 주석이 있습니다.

따라서 이러한 클래스 / 필드는 내가 상상하는 이름으로 변경하면 안됩니다.

(목표는 단지 ​​디 컴파일 (decompile)을하는 사람에게 두통을 일으켜 코드를 디 컴파일하고 사용할 수 없도록하기 위해서이다. 난독 화 (obfuscating)는 코드베이스를 사용하게하지만 코드베이스를 유지 보수 할 수는 없다. 나는 그와 같은면에서 숨길 것이 전혀없는 멋진 알고리즘을 가지고 있지 않다.)

최신 정보

여기서 mvn clean install을 할 때 myapp.war 파일과 exploded war myapp /를 생성 할 때 어떤 이유로 든 maven을 사용하는 mvc (maven을 처음 사용하는 사람)을 명확히 해두겠습니다. (이것은 내가 배치하고자하는 것입니다. myapp.war 파일이 아닌 제작).

myapp 폴더에는 다음 항목이 있습니다.

/target/myapp/
/target/myapp/meta-inf (empty folder)
/target/myapp/web-inf
/target/myapp/web-inf/classes (com.myapp. ...)
/target/myapp/web-inf/lib/
/target/myapp/web-inf/ web.xml, application.xml (for spring)
/target/myapp/web-inf/views/

따라서 proguard는 / target / myapp / web-inf / classes 폴더에서 난독 화되어야합니다. 그렇게하도록 어떻게 말합니까?

업데이트 2

나는 이것을 지금 얻고있다 :

OK, 나는 얻지 못한다 : 목표를 실행하지 못했다 ... proguard .. / Users / me / dev / git / project1 / myapp / target / myapp / web-inf / classes의 이름을 바꿀 수 없다. 내 pom.xml에서 변경됨)

내 pom.xml을 다음과 같이 변경했습니다.

            <configuration>
                <obfuscate>true</obfuscate>

                <injar>${project.build.finalName}/WEB-INF/classes/</injar>
                <inFilter>com/myapp/**</inFilter>
            </configuration>

해결법

  1. ==============================

    1.ProGuard 필터는 파일 이름에서 작동하므로

    ProGuard 필터는 파일 이름에서 작동하므로

    .....(!META-INF/maven/**,com.myapp.*)
    

    아마도 어떤 클래스 파일과도 일치하지 않을 것입니다. 너는 아마 원할거야.

    .....(!META-INF/maven/**,com/myapp/**)
    

    ProGuard 매뉴얼> 사용법> 파일 필터를 참조하십시오.

  2. ==============================

    2.당신은 당신의 전체 pom을 게시 할 수 있습니까?

    당신은 당신의 전체 pom을 게시 할 수 있습니까?

    일반적으로 Maven은 / target / classes (WAR 파일의 경우에도)로 컴파일되고 WAR 플러그인은 패키지 단계 직전에 web-inf / classes에 복사를 수행합니다. Maven을 사용하여 수동으로 클래스를 web-inf / lib로 컴파일해서는 안됩니다.

    편집 : 좋아,이 꽤 연구가 걸릴 수 있지만 당신을 위해 대답을 찾았습니다. 첫째, ProGuard 문서에 따르면, 당신은 당신의 전쟁 프로젝트에 어떤 클래스도 가져서는 안됩니다 :

    웹 클래스가 별도의 병에 구축되도록 프로젝트를 리팩토링해야합니다. 일단 jar 프로젝트를 빌드하고 나면, 그것을 당신의 전쟁 프로젝트의 의존성으로 추가해야합니다.

    일단 그 설정을 만들었 으면 다음 구성으로 전쟁 프로젝트를 성공적으로 만들 수있었습니다 :

    <build>
            <plugins>
                <plugin>
                    <groupId>com.pyx4me</groupId>
                    <artifactId>proguard-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>proguard</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <inFilter>com/example/**</inFilter>
                        <libs>
                            <lib>${java.home}/lib/rt.jar</lib>
                            <lib>${java.home}/lib/jsse.jar</lib>
                        </libs>
                        <options>
                            <option>-keep class com.example.echo.EchoServlet</option>
                            <option>-injar ${project.build.directory}/${project.build.finalName}.${project.packaging}</option>
                            <option>-outjar ${project.build.directory}/${project.build.finalName}-proguarded.${project.packaging}</option>
                        </options>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    "com.example.echo.EchoServlet"을 주목하십시오. progaurd가 클래스의 이름을 변경하려고했기 때문에이 서블릿 이름을 "유지"해야만 WAR 프로젝트의 web.xml에서 참조 할 수있었습니다. 어노테이션 기반 서블릿 구성을 사용하는 경우 이것이 필요하지 않을 것이라고 생각합니다.

  3. from https://stackoverflow.com/questions/8845406/proguard-is-saying-it-cant-find-any-classes by cc-by-sa and MIT license