Използване на Proguard в Gradle - не може да намери препратен клас java.lang.String

Опитвам се да конфигурирам ProGuard като част от моите скриптове за изграждане на Gradle за java приложение в Ubuntu, достъпно чрез bash, но изглежда не мога да го направя правилно. Никога преди не съм използвал нито една от двете технологии. С помощта на Ръководството на ProGuard написах следната задача, която в момента изпълнявам вече съществуващ jar файл, докато се опитвам да накарам нещо да работи.

task obfuscate(type: proguard.gradle.ProGuardTask) {
  injars         'build/libs/myapplication.jar'
  outjars        'build/libs/myapplication_out.jar'
  libraryjars    '<java.home>/lib/rt.jar'
  printmapping   'myapplication.map'

  keep 'public class mypackage.MyMainClass {  \
    public static void main(java.lang.String[]);  \
  }'
}

Получавам много редове, в които се посочва, че липсват вградени файлове на java библиотека като:

Warning: myclasses: can't find referenced class java.lang.String

В долната част на списъка виждам също:

Could not call ProGuardTask.proguard()

Ако проверя моята изходна директория, мога да видя, че е създала структурата на директорията, но не и jar файла и това е, което виждам, ако стартирам задачата си gradle със stacktrace на:

Caused by: org.gradle.api.GradleException: Could not call ProGuardTask.proguard() on task

Разгледах страницата за отстраняване на неизправности на proguard и каза, че трябва да се уверя, че посочвам библиотеката по време на изпълнение на моята платформа и че за JSE това е lib/rt.jar. Можете да видите това горе в аргумента за библиотечните буркани. Какво погрешно съм разбрал?


person Nickel    schedule 02.04.2014    source източник
comment
Първото нещо, което трябва да разберете, е дали Could not call ProGuardTask.proguard() идва от Gradle или ProGuard. Може би показва пълната трасировка на стека. can't find referenced class java.lang.String звучи сякаш ProGuard не е конфигуриран правилно.   -  person Peter Niederwieser    schedule 02.04.2014


Отговори (2)


ProGuard не чете буркана за изпълнение, защото името му трябва да бъде указано по различен начин.

В конфигурационните файлове на ProGuard можете да напишете:

-libraryjars <java.home>/lib/rt.jar

Във файловете за изграждане на Gradle трябва да използвате стила на Gradle:

libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
person Eric Lafortune    schedule 30.04.2014
comment
Знаете ли къде да намерите rt.jar или еквивалент с JDK 10? Изглежда, че вече не идва с JDK - person MariusVolkhart; 14.05.2018
comment
@MariusVolkhart rt.jar беше премахнат от jdk 9 - person G. Ciardini; 21.05.2021

Ето какво направих, за да настроя моя клас път за моята задача gradle proguard. Използва задача за копиране, за да събере всички jar файлове в игра и след това ги посочи в задачата proguard.

task prepare(type: Copy) {

    dependsOn 'jar'

    destinationDir = file("$buildDir/assemble/izpack")
    includeEmptyDirs = true

    into('lib') {
        from configurations.compile
    }
    into('proguard') {
        from configurations.runtime {  include '*truelicense*.jar' }
    }
}


task proguard (type: proguard.gradle.ProGuardTask) {

    dependsOn 'prepare'

    configuration "proguard.conf"

    injars jar.archivePath
    fileTree("$buildDir/assemble/izpack/proguard").include("*.jar").each { f ->
        injars f.path, filter: '!META-INF/MANIFEST.MF'
    }

    outjars "$buildDir/assemble/izpack/web/WEB-INF/lib/${jar.baseName}-${jar.version}.${jar.extension}"

    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
    fileTree("$buildDir/assemble/izpack/lib").include("**/*.jar").collect { f -> libraryjars f.path }
    fileTree("$buildDir/assemble/izpack/web").include("**/*.jar").collect { f -> libraryjars f.path }
}
person chenson42    schedule 05.12.2014