javassist修改jar包

aspose slide为ppt文件生成预览图片,生成图片有水印,可以用javassist修改jar包的方式来去除水印限制

pom文件

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-slides</artifactId>
    <version>22.9</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/aspose-slides-22.9-jdk16.jar
    </systemPath>
    <classifier>jdk16</classifier>
</dependency>
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.28.0-GA</version>
</dependency>

填个错的license试试

 String license =
                "<License>\n" +
                        "  <Data>\n" +
                        "    <Products>\n" +
                        "      <Product>Aspose.Total for Java</Product>\n" +
                        "      <Product>Aspose.Words for Java</Product>\n" +
                        "    </Products>\n" +
                        "    <EditionType>Enterprise</EditionType>\n" +
                        "    <SubscriptionExpiry>20991231</SubscriptionExpiry>\n" +
                        "    <LicenseExpiry>20991231</LicenseExpiry>\n" +
                        "    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-</SerialNumber>\n" +
                        "  </Data>\n" +
                        "</License>";
        InputStream is = new ByteArrayInputStream(license.getBytes(StandardCharsets.UTF_8));
        License aposeLic = new License();
        aposeLic.setLicense(is);

看看报错信息

2022-12-04 03:03:45.498 ERROR 63412 --- [nio-8091-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is class com.aspose.slides.exceptions.InvalidOperationException: License parsing error ---> class com.aspose.slides.exceptions.InvalidOperationException: Signature check error. ---> java.security.SignatureException: Signature length not correct: got 0 but was expecting 256
   --- End of inner exception stack trace ---
com.aspose.slides.internal.oh.final.do(Unknown Source)
com.aspose.slides.internal.oh.return.do(Unknown Source)
com.aspose.slides.internal.oh.return.if(Unknown Source)
com.aspose.slides.internal.oh.return.do(Unknown Source)
com.aspose.slides.License.setLicense(Unknown Source)

com.aspose.slides.internal.oh.return类的do方法

private static void do(Node var0, Node var1, String[] var2) {
    try {
        String var3 = var0 != null ? do(var0) : "";
        byte[] var4 = var3.getBytes("UTF-16LE");
        String var5 = var1 != null ? var1.getFirstChild().getNodeValue() : "";
        byte[] var6 = com.aspose.slides.internal.oh.try.do(var5);
        PublicKey var7 = null;

        try {
            KeyFactory var8 = KeyFactory.getInstance("RSA");
            RSAPublicKeySpec var9 = this.do(if(var2), var6);
            var7 = var8.generatePublic(var9);
        } catch (Exception var15) {
            (new final() {
            }).do((new boolean() {
            }).if, var15);
        }

        Signature var17;
        if (var6.length == 128) {
            var17 = Signature.getInstance("SHA1withRSA");
            var17.initVerify(var7);
            var17.update(var4);
            do(var17, var6);
        } else {
            try {
                var17 = Signature.getInstance("SHA256withRSA");
                var17.initVerify(var7);
                var17.update(var4);
                do(var17, var6);
            } catch (InvalidOperationException var14) {
                InvalidOperationException var18 = var14;

                try {
                    String var19;
                    if (if(var2)) {
                        var19 = long.if(var6);
                    } else {
                        var19 = long.do(var6);
                    }

                    String var10 = "AQAB";
                    byte[] var11 = com.aspose.slides.internal.oh.try.do(var19);
                    byte[] var12 = com.aspose.slides.internal.oh.try.do(var10);
                    if (!implements.do(var4, var6, var11, var12)) {
                        (new final() {
                        }).do((new boolean() {
                        }).int, var18);
                    }
                } catch (Exception var13) {
                    (new final() {
                    }).do((new boolean() {
                    }).int, var14);
                }
            }
        }
    } catch (Exception var16) {
        (new final() {
        }).do((new boolean() {
        }).int, var16);
    }

}

方法签名是void,没有返回值,应该是里面做了什么见不得人的事

修改启动方法


@SpringBootApplication
public class PptApplication {

    public static void main(String[] args) {
//        SpringApplication.run(PptApplication.class, args);
        modifyPptJar();
    }

    public static void modifyPptJar() {
        try {
            ClassPool.getDefault().insertClassPath("/Users/bao/Documents/devworkspace/java/ppt/src/main/resources/lib/aspose-slides-22.9-jdk16.jar");//jar包地址
            CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.slides.internal.oh.return"); //修改这个类
            CtMethod[] methodA = zzZJJClass.getDeclaredMethods();
            for (CtMethod ctMethod : methodA) {
                CtClass[] ps = ctMethod.getParameterTypes();
                if (ps.length == 3 && ctMethod.getName().equals("do")) {//3个参数并且方法名是do的方法
                    System.out.println("ps[0].getName==" + ps[0].getName());
                    ctMethod.setBody("{}"); //把这个方法清空
                }
            }
            zzZJJClass.writeFile("/Users/bao/Desktop");//把修改后的文件保存到桌面
        } catch (Exception e) {
            System.out.println("错误==" + e);
        }
    }
}

解压原始jar包,删除里面的ASPOSE.RSA文件和ASPOSE.SF文件,然后把桌面新生成的/Users/bao/Desktop/com/aspose/slides/internal/oh/return.class文件放到jar包里,mac可以用maczip这个软件,也不用解压,直接文件拖到maczip里,问你是否替换,确定就可以更新jar包了

最后把新的jar包加到项目里,maven更新下就没水印了