当前位置:  开发笔记 > 编程语言 > 正文

如何在构建"maven-plugin"包时使用Proguard混淆?

如何解决《如何在构建"maven-plugin"包时使用Proguard混淆?》经验,为你挑选了1个好方法。

"maven-plugin"项目的生成输出JAR(使用maven-plugin-plugin)被Proguard工具执行的混淆打破.尝试将混淆的JAR用作Maven插件会生成异常,例如MojoExecutionException,它会以错误终止构建.什么是适当的Proguard配置选项,以允许生成包含自动生成的插件描述符的工作"maven-plugin"JAR?



1> Emily Mabrey..:

Maven插件和Proguard工具的基础知识

为了生成Maven插件(maven包装类型"maven-plugin",它生成包含特定于插件的配置资源的JAR),我们必须在moven-plugin-plugin上指示我们Mojos的位置和名称.假设正确配置maven-plugin-plugin执行,使用注释或其他配置选项,生成的JAR将在JAR根目录的META-INF目录中包含plugin.xml文件.此plugin.xml文件使用对Java类和包名称的静态引用来描述插件的目标和可配置参数(您可以在此处找到有关此文件的更多信息).

必须特别注意将混淆纳入"maven-plugin"JAR的构建中; 这里我们解释使用Proguard混淆库所采取的步骤.当使用图书馆混淆默认Proguard的配置,生成JAR将不再正常工作,因为Proguard的重命名,收缩,重新定位和混淆重要文件的Maven插件.尝试使用您的插件可能会导致异常,该异常终止构建时出现与Maven运行时无法定位和处理插件的配置和类文件相关的错误.

但是,通过一些重新配置,我们可以指示Proguard正确维护生成的插件文件和"maven-plugin"JAR的目录结构.Proguard选项的必要更改如下:


自定义Proguard配置

目录结构

-keepdirectories

这指示Proguard维护输入JAR目录结构,而不是将所有文件移动到根目录.Maven希望plugin.xml文件位于/ META-INF/maven /目录中,并通过此选项与所有其他目录一起保存.您可以通过指定目录过滤器来更具体地过滤保留的目录,但是我选择不加选择地维护所有输入目录结构.

静态包参考

-keeppackagenamesorg.apache.maven.plugin.my.MyMojo

您应该使用包含Mojo定义的包替换占位符包.如果您的Mojo定义不共享公共包,则应根据需要使用多个选项指定每个唯一包.如果您不确定需要保留哪些包,请在文本编辑器中打开生成的plugin.xml文件,并检查每个"mojo"定义中的"implementation"元素."implementation"元素通过完全限定名称指定类.这些完全限定类名的每个包组件都是您应该指定的包.例如,我的basedir-plugin包含一个Mojo实现元素值"com.github.emabrey.maven.plugins.basedir.RootDirectoryGoal",所以我将该选项写为-keeppackagenames com.github.emabrey.maven.plugins.basedir.

静态类引用

-keepnamesclass * implements org.apache.maven.plugin.AbstractMojo

此选项可防止Proguard重命名包含Maven插件Mojo实现的类.如果重命名这些类,则上述"实现"元素将不再正确识别包含Mojo实现的类.

私有类字段和方法

-keepclassmembersclass * implements org.apache.maven.plugin.AbstractMojo { private ; private ; }

此选项可防止Proguard重命名插件Mojo实现中的类级别方法和字段.Maven使用这些类字段/方法的名称来生成插件的配置元素.如果Proguard重命名字段,则Maven执行环境将无法使用用户配置正确填充Mojo实现.


完成了Proguard配置

为方便起见,此处提供了版本2.0.13的完整配置(此处为更多版本),包括默认库配置以及所提及的修改(请记住${tool.proguard.version}使用最新版本的proguard-base工件指定属性并替换占位符使用适当的值打包"org.apache.maven.plugin.my.MyMojo":



    com.github.wvengen
    proguard-maven-plugin
    2.0.13
    
        
            obfuscation-packaging
            package
            
                proguard
            
            
                ${tool.proguard.version}
                true
                true
                false
                true
                ${project.build.finalName}.jar
                true
                
                    ${java.home}/lib/rt.jar
                

                
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                
            
        
    
    
        
            net.sf.proguard
            proguard-base
            ${tool.proguard.version}
        
    
  


感谢您的信息。我能够使用您的答案和/sf/ask/17360801/在项目中实施proguard。
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有