我正在尝试使用ProGuard混淆我的intellij插件。
我正在向IntelliJ添加一些内部fileTemplates以创建新文件。 <RelatedTemplateName>
是我添加到resources/fileTemplates/internal/<RelatedTemplateName>.ft
到目前为止很好,除了...
在混淆插件中: IntelliJ代码在我的插件中找不到某些资源文件。
在未混淆的插件中: 一切正常。
我曾经以为proguard更改了我的资源文件,但我不认为根据此link更改了任何资源文件 ,因为我没有在proguard.pro文件中添加此类选项
有人会帮助我找出此问题的根本原因吗?谢谢
是因为proguard更改了与此相关的其他一些类吗?
下面的其他相关信息
例外
java.lang.Throwable: Template not found: <RelatedTemplateName>
at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getTemplateFromManager(FileTemplateManagerImpl.java:294)
at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getJ2eeTemplate(FileTemplateManagerImpl.java:279)
at com.intellij.ide.fileTemplates.impl.FileTemplateManagerImpl.getInternalTemplate(FileTemplateManagerImpl.java:242)
at XXX.XXX.XXX.createNewFile(MyNewFileAction.java:104)
我的proguard配置:
build.gradle文件的相关部分:
def getIDEAPath(){
if(intellij.localPath!=null && !intellij.localPath.isEmpty()){
return intellij.localPath
}
def ideTempPath = file("$gradle.gradleUserHomeDir/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/$intellij.version")
def ideBasePath = ideTempPath;
ideTempPath.traverse([maxDepth: 2, type: groovy.io.FileType.DIRECTORIES]) {
it ->
if (it.absolutePath.contains("lib")) {
ideBasePath = file(it.absolutePath);
};
}
return ideBasePath.parent
}
task myProguardTask(type: proguard.gradle.ProGuardTask, dependsOn: jar) {
printmapping "build/mapping.txt"
configuration 'proguard.pro'
// Automatically handle the Java version of this build.
if (System.getProperty('java.version').startsWith('1.')) {
// Before Java 9, the runtime classes were packaged in a single jar file.
libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
} else {
// As of Java 9, the runtime classes are packaged in modular jmod files.
libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
libraryjars "${System.getProperty('java.home')}/jmods/java.sql.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
//libraryjars "${System.getProperty('java.home')}/jmods/....."
}
def ideaPath = getIDEAPath()
libraryjars fileTree("$ideaPath/plugins/java/lib").filter { !it.name.startsWith("debugger") }.collect()
libraryjars files("$ideaPath/lib")
libraryjars files(configurations.compile.collect())
def original = jar.archiveFile.get().asFile
def obfuscated = new File(original.parent, "obfuscated.jar")
injars original
outjars file(obfuscated.path)
}
prepareSandbox.dependsOn(myProguardTask)
prepareSandbox.doFirst {
def original = jar.archiveFile.get().asFile
def obfuscated = new File(original.parent, "obfuscated.jar")
if (original.exists() && obfuscated.exists()) {
original.delete()
obfuscated.renameTo(original)
} else {
println "error: some file does not exist, plugin file not obfuscated"
}
}
我的proguard.pro文件的相关部分:
-adaptresourcefilecontents已被注释掉
-target 1.8
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod
##-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF
-verbose
-keepclassmember class * {
public <init>(***);
}
# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
答案 0 :(得分:0)
哦,我终于找到解决方案。因此,最后,proguard并未更改我的资源文件,但它确实更改了我的资源文件夹
解决方案:
我在proguard.pro文件中添加了-keepdirectories
,以将所有目录保留在jar文件中。
MissingResourceException或NullPointerException
您处理后的代码可能找不到某些资源文件。 ProGuard只需将资源文件从输入jar复制到 输出罐子。它们的名称和内容保持不变,除非您 指定options-adaptresourcefilenames 和/或-adaptresourcefile内容。此外,目录条目在 除非指定选项,否则不会复制jar文件 -keepdirectories。请注意,Sun建议不要为目录调用Class.getResource()(Sun Bug) #4761949](http://bugs.sun.com/view_bug.do?bug_id=4761949))。
这是-keepdirectories
的{{3}}
报价
默认情况下,目录条目被删除。