混淆技术研究笔记(七)Ant扩展介绍

news2024/10/12 20:23:13

logo

ant 扩展官方文档:https://ant.apache.org/manual/develop.html

Writing Your Own Task

编写你自己的任务

1. 创建一个XXTask类

创建一个Java类继承org.apache.tools.ant.Task ,实际上不继承也可以,定义一个 execute() 方法就可以,例如下面的例子:

public class MyTask {
    public void execute() {
        System.out.println("MyTask");
    }
}

配置到插件中测试:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <id>obfuscate</id>
            <configuration>
                <tasks>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <taskdef name="my-task" classname="MyTask" classpath="${runtime_classpath}"/>
                    <my-task/>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

后续示例只提供 <tasks> 中的内容。
可以在示例的 module-yguard 中的 pom.xml 中测试。

执行 package 打包,部分输出日志如下:

[INFO] --- maven-antrun-plugin:1.8:run (obfuscate) @ module-yguard ---
[WARNING] Parameter tasks is deprecated, use target instead
[INFO] Executing tasks

main:
MyTask
[INFO] Executed tasks

接下来继承 org.apache.tools.ant.Task 试试:

public class MyTask extends org.apache.tools.ant.Task {
    public void execute() {
        System.out.println("MyTask, name: " + getTaskName());
    }
}

执行输出的部分日志如下:

[INFO] --- maven-antrun-plugin:1.8:run (obfuscate) @ module-yguard ---
[WARNING] Parameter tasks is deprecated, use target instead
[INFO] Executing tasks

main:
MyTask, name: my-task
[INFO] Executed tasks

警告中建议将 tasks 改为 target,修改试试:

<target>
    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
    <taskdef name="my-task" classname="MyTask" classpath="${runtime_classpath}"/>
    <my-task/>
</target>

再次运行就没有警告信息了。

2. 给 <my-task> 添加属性

<my-task> 添加属性,例如:

<my-task path="${user.dir}"/>

为了能接收这个属性值,需要在 MyTask 添加对应的 setter 方法, setter 方法必须是采用单个参数public void 方法,修改如下:

import java.io.File;

public class MyTask extends org.apache.tools.ant.Task {
    private File path;

    public void setPath(File path)
    {
        this.path = path;
    }

    public void execute() {
        System.out.println("MyTask, name: " + getTaskName() + ", path: " + path);
    }
}

执行测试输出内容如下:

[INFO] --- maven-antrun-plugin:1.8:run (obfuscate) @ module-yguard ---
[INFO] Executing tasks

main:
MyTask, name: my-task, path: E:\GitHub\yguard-modules-parent
[INFO] Executed tasks

可以看到 Ant 自动把参数转换为 File 类型了,Ant 支持的转换规则如下:

  1. 最常见的 java.lang.String 类型;
  2. boolean类型,支持设置为 true,yes,on,其他值则为 false。这部分的逻辑在 Project 类中,代码如下:
    public static boolean toBoolean(final String s) {
         return ("on".equalsIgnoreCase(s)
                 || "true".equalsIgnoreCase(s)
                 || "yes".equalsIgnoreCase(s));
     }
    
  3. charjava.lang.Character,将传递指定值的第一个字符;
  4. 其他基本类型(int,short,long,float,double,byte);
  5. java.io.File,Ant首先会判断构建文件中给出的值是否代表绝对路径名。如果不是,Ant 会将该值解释为相对于项目的 basedir 的路径名;
  6. org.apache.tools.ant.types.Resource,Ant 会将字符串解析为上面的 java.io.File ,然后作为 org.apache.tools.ant.types.resources.FileResource 传入;
  7. org.apache.tools.ant.types.Path,Ant 将标记化构建文件中指定的值,接受 : 和 ;作为路径分隔符。相对路径名将被解释为相对于项目的 basedir;
  8. java.lang.Class ,Ant 会将构建文件中给出的值解释为 Java 类名,并从系统类加载器加载指定的类;
  9. org.apache.tools.ant.types.EnumeratedAttribute 的子类,会调用子类的 setValue 方法,设置的值必须是抽象方法 String[] getValues() 包含的值,通常用于指定固定选项。
  10. 枚举值,会和枚举的 name 进行匹配。

3. 给 <my-task> 添加文本数据

添加文本数据示例:

<my-task path="${user.dir}" enable="hello">中间的文本</my-task>

很显然这种方式和在<my-task>添加子元素是冲突的,这种情况下需要添加 public void addText(String) 方法,代码如下:

import java.io.File;

public class MyTask extends org.apache.tools.ant.Task {
    private File path;
    private boolean enable;
    private String text;

    public void setEnable(boolean enable)
    {
        this.enable = enable;
    }

    public void setPath(File path)
    {
        this.path = path;
    }

    public void addText(String text) {
        this.text = text;
    }

    public void execute() {
        System.out.println("MyTask, name: " + getTaskName() + ", path: " + path + ", enable: " + enable + ", text: " + text);
    }
}

测试输出结果:

[INFO] --- maven-antrun-plugin:1.8:run (obfuscate) @ module-yguard ---
[INFO] Executing tasks

main:
MyTask, name: my-task, path: E:\GitHub\yguard-modules-parent, enable: false, text: 中间的文本
[INFO] Executed tasks

4. 给 <my-task> 添加嵌套元素

例如前面提到的 <patternset> 元素:

<my-task>
    <patternset>
        <include name="org.example.c."/>
        <exclude name="org.example.c.util.FileUtil"/>
    </patternset>
</my-task>

更新 MyTask 代码:

import org.apache.tools.ant.types.PatternSet;

import java.util.ArrayList;
import java.util.List;

public class MyTask extends org.apache.tools.ant.Task
{
  /**
   * The Pattern sets.
   */
  private List<PatternSet> patternSets = new ArrayList(5);

  public void addConfiguredPatternSet(PatternSet ps)
  {
    patternSets.add(ps);
  }

  public void execute()
  {
    patternSets.forEach(ps ->
    {
      String[] includes = ps.getIncludePatterns(getProject());
      String[] excludes = ps.getExcludePatterns(getProject());
      System.out.println("includes: " + String.join(", ", includes));
      System.out.println("excludes: " + String.join(", ", excludes));
    });
  }
}

执行代码输出结果:

[INFO] --- maven-antrun-plugin:1.8:run (obfuscate) @ module-yguard ---
[INFO] Executing tasks

main:
includes: org.example.c.
excludes: org.example.c.util.FileUtil
[INFO] Executed tasks

对于每个嵌套元素,需要编写一个 createaddaddConfigured 方法。 create 方法必须是不带参数并返回 Object 类型的 public 方法。 create 方法的名称必须以 create 开头,后跟元素名称。 add(或 addConfigured)方法必须是一个 public void 方法,该方法采用带有无参数构造函数的 Object 类型的单个参数。 add (addConfigured) 方法的名称必须以 add ( addConfigured ) 开头,后跟元素名称。

也就是上面示例中,支持下面3种写法:

public PatternSet createPatternSet()
{
  PatternSet ps = new PatternSet();
  patternSets.add(ps);
  return ps;
}

public void addPatternSet(PatternSet ps) {
  patternSets.add(ps);
}

public void addConfiguredPatternSet(PatternSet ps)
{
  patternSets.add(ps);
}

这3种写法不能同时存在,具体差异通过 debug 来查看。测试时注释另外两个方法。

4.1 createXxx 方法

在这里插入图片描述
这个方法会创建一个空的 PatternSet 对象,这个对象需要提前添加到 patternSets,否则后续无法获取该值。这里返回该对象后,这个对象会被赋值,在后续执行 execute 时是有值的。

当你嵌套的对象需要复杂的创建方式时,可以采用这种方式,这种方式适合初始化对象。

4.2 addXxx 方法

在这里插入图片描述
可以看到Ant自己实例化了一个PatternSet对象注入进来了,而且此时该对象是空的,还没有被赋值,这种情况下的参数(如这里的PatternSet)需要提供 public 无参数构造方法或将 Project 类作为参数的 public 单参数构造方法

4.3 addConfiguredXxx

在这里插入图片描述
这个方法和上一个类似,但是这里会传入一个配置好的 PatternSet,如果你需要在配置好的对象上进行后续处理,可以使用这个方法,如果想在配置前处理,可以选择前两种方式。

4.4 不要同时使用这3种方法

同时存在时不一定会调用哪一个方法,当你方法中存在逻辑时,就无法保证处理一致。不会像你所想的,先调用 create 创建对象,再通过 add 初始化值,最后调用 addConfigured 方法进行后续处理。

了解这些内容后就可以扩展 Ant 任务了,下一节开始针对 yGuard 进行扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】制作一个windows端自动化工具!

作为一名自动化工程师&#xff0c;这一章&#xff0c;带大家来看看我是如何制作一个windows端的自动化工具&#xff0c;本章节内容我会从基础的环境配置、基础模块介绍、框架设计、实际运用等方面来讲解&#xff0c;对于想要未来从事该行业的人来说&#xff0c;希望这篇文章能给…

公司重要文件防泄密

公司重要文件防泄密是企业管理中一项非常重要的任务&#xff0c;今天分享几个可以防止公司重要文件泄密的方式&#xff1a; 1、建立完善的文件管理制度 企业应该制定严格的文件管理制度&#xff0c;包括文件分类、加密、访问权限的管理等。确保每个员工都了解文件管理制度并严…

【力扣1528】重新排列字符串

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、Java代码2、C代码 一、题目描述 给你一个字符串 s 和一个长度相同的整数数组 indices。 请你…

GLIP DetCLIP

1 GLIP: 十分钟解读GLIP&#xff1a;Grounded Language-Image Pre-training - 知乎 Grounded Language-Image Pre-training&#xff08;GLIP&#xff09;论文笔记 - 知乎 GLIP的主要贡献如下&#xff1a; 将phrase grounding和目标检测任务统一&#xff0c;将image和text pr…

Docker 快速入门体验

Docker 是什么&#xff1f; Docker 是一个开源项目&#xff0c;它能够自动化部署应用程序&#xff0c;通过所谓的容器来实现。这些容器允许开发者将自己的应用以及依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 或 Windows 机器上也可以实现虚拟化。Do…

Linux系统中配置系统

在Linux系统中配置系统设置->网络设置代理的详细教程如下&#xff1a; 首先&#xff0c;确保您已经安装了NetworkManager和nmtui。在终端中输入以下命令&#xff1a; sudo apt-get update sudo apt-get install network-manager nmtui 打开系统设置。在桌面上点击“设置”…

文件和命令的查找与处理

1.命令查找 which which 接命令 2.文件查找 find 按文件名字查找 准确查找 find / -name "hosts" 粗略查找 find / -name "ho*ts" 扩展名查找 find / -name "*.txt" 按文件类型查找 find / -type f 文件查找 find / -ty…

哈夫曼树实现哈夫曼编码(C++)

题目要求&#xff1a;根据哈夫曼编码的原理&#xff0c;编写一个程序&#xff0c;在用户输入结点权值的基础上求赫夫曼编码&#xff0c;并能把给定的编码进行译码。 &#xff08;1&#xff09;初始化&#xff1a;从键盘输入一字符串&#xff08;或读入一文件&#xff09;&…

【微服务】spring webflux使用详解

目录 一、webflux介绍 1.1 什么是webflux 1.2 什么是响应式编程 1.3 webflux特点 二、Java9中响应式编程 2.1 定义事件流源 2.2 实现订阅者 三、Spring Webflux介绍 四、Reactor 介绍 五、Reactor 常用API操作 5.1 Flux 创建流操作API 5.2 Flux响应流的订阅 5.3 Fl…

PHP WAP餐厅点餐系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP餐厅点餐系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP WAP餐厅点餐系统 代码 https://download.csdn.net/download/qq_41221322/88440001 二、…

Kubeadm部署k8s集群 kuboard

目录 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步(所有节点) 配…

【密码学】第三章、分组密码

DES、IDEA、AES、SM4 1、分组密码定义&#xff08;按照五个组成部分答&#xff09; 密钥空间&#xff1a;属于对称加密算法kekd明密文空间&#xff1a;将明文划分为m比特的组&#xff0c;每一块依次进行加密加解密算法&#xff1a;由key决定一个明文到密文的可逆映射 2、发展…

C语言入门-1.1 C语言概述

想要学好一门计算机编程语言&#xff0c;就和谈一个女朋友是一样的&#xff0c;需要对其深入了解。 1、计算机语言 &#xff08;1&#xff09;什么是计算机语言&#xff1f; 顾名思义&#xff0c;就是计算机之间交流的语言&#xff0c;就和人一样&#xff0c;咱们都是使用普通…

中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例

中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例 中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&a…

PHP的四层架构

PHP的4层架构是一种软件设计模式&#xff0c;用于将一个PHP应用程序划分为不同的层次&#xff0c;以实现解耦、可扩展和易于维护的代码结构。这个架构通常由以下四个层次组成&#xff1a; 1、 表现层&#xff08;Presentation Layer&#xff09;&#xff1a; 表现层是与用户直…

动态规划解股票类型

文章目录 单只股票买卖多次买卖单只股票最多两次买卖股票最多买k次含冷静期含手续费 单只股票买卖 买卖股票的最佳时机 关键思路&#xff1a;找到一个值&#xff0c;他与之后的最大值之差最大。 用minprice记录最小的值&#xff0c;用maxprofit记录最大的收益。 想清楚一个点…

麒麟kylinOS 2303制作自定义免交互安装镜像

原文链接&#xff1a;麒麟kylinOS 2303制作自定义免交互安装镜像 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟kylinOS 2303制作自定义免交互ISO安装镜像的文章&#xff0c;内容相对来说比较简单&#xff0c;测试安装了一个360浏览器软件&#xff0c;后续复杂…

c语言练习93:环形链表的约瑟夫问题

环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是…

【CesiumforUnreal插件】UE5 快速构建Cesium场景 快速入门!!!

目录 0 引言1 快速入门1.1 准备1.2 安装Cesium for Unreal插件并创建一个项目1.3 准备关卡并添加地形和纹理1.4 添加3D建筑到场景中1.5 探索场景 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;CesiumforUnreal专栏&#x1f4a5; 标题&#xff1a…

论坛介绍|COSCon'23开源商业(V)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…