修改pom配置文件
我使用的是JDK21,所以需要高版本的ProGuard,低版本的不行
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>iptvcrm</artifactId>
<groupId>com.wisetv</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.6.1</version>
<executions>
<execution>
<id>proguard</id>
<!-- 在打包阶段混淆-->
<phase>package</phase>
<goals>
<!-- 只使用混淆功能-->
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardVersion>7.5.0</proguardVersion>
<!-- 原始jar包-->
<injar>${project.build.finalName}.jar</injar>
<!-- 混淆之后的jar包名 此处与原始一样 混覆盖原始jar包-->
<outjar>${project.build.finalName}-pg.jar</outjar>
<obfuscate>true</obfuscate>
<options>
<option>-dontshrink</option>
<option>-dontoptimize</option>
<!-- ##对于类成员的命名的混淆采取唯一策略-->
<option>-useuniqueclassmembernames</option>
<!-- This option will replace all strings in reflections method invocations with new class names.
For example, invokes Class.forName('className')-->
<option>-adaptclassstrings</option>
<!-- ## 混淆时不生成大小写混合的类名,默认是可以大小写混合-->
<option>-dontusemixedcaseclassnames</option>
<!-- This option will save all original annotations and etc. Otherwise all we be removed from files.-->
<option>-keepattributes
Exceptions,
InnerClasses,
Signature,
Deprecated,
SourceFile,
LineNumberTable,
*Annotation*,
EnclosingMethod
</option>
<!-- This option will save all original names in interfaces (without obfuscate).-->
<option>-keepnames interface **</option>
<!-- This option will save all original methods parameters in files defined in -keep sections,
otherwise all parameter names will be obfuscate.-->
<!-- <option>-keepparameternames</option>-->
<!-- This option will save all original class files (without obfuscate) but obfuscate all
in domain and service packages.-->
<option>-keep
class com.wisetv.useroutbound.app.UserOutBoundApplication {
public static void main(java.lang.String[]);
}
</option>
<!-- This option ignore warnings such as duplicate class definitions and classes in incorrectly
named files-->
<option>-ignorewarnings</option>
<!-- This option will save all original class files (without obfuscate) in service package-->
<!-- <option>-keep class com.slm.proguard.example.spring.boot.service { *; }</option>-->
<!-- This option will save all original interfaces files (without obfuscate) in all packages.-->
<option>-keep interface * extends * { *; }</option>
<!-- This option will save all original defined annotations in all classes in all packages.-->
<option>-keep class com.fasterxml.jackson.** { *; }</option>
<option>-keeppackagenames com.wisetv.**</option>
<option>-keep class com.wisetv.useroutbound.model.entity.** { *; }</option>
<option>-keep class com.wisetv.useroutbound.core.** { *; }</option>
<option>-keep class com.wisetv.useroutbound.dao.** { *; }</option>
<option>-keep class com.wisetv.useroutbound.controller.** { *; }</option>
<option>-keep class com.wisetv.iptvcrm.common.model.** { *; }</option>
<option>-keep class org.json.JSONObject.** {** put(java.lang.String,java.util.Map);}</option>
<option>-keep class org.gitlab4j.**</option>
<option>-keep class org.hibernate.** { *; }</option>
<option>-keepclassmembers class * {
@org.springframework *;
@org.springframework.context.annotation.Bean *;
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
}
</option>
<option>-dontwarn com.fasterxml.jackson.databind.**</option>
<option>-dontwarn com.fasterxml.jackson.**</option>
</options>
<assembly>
<inclusions>
<inclusion>
<groupId>com.wisetv</groupId>
<artifactId>iptvcrm-common</artifactId>
</inclusion>
<inclusion>
<groupId>com.wisetv</groupId>
<artifactId>crmsecurity</artifactId>
</inclusion>
</inclusions>
</assembly>
<injarNotExistsSkip>true</injarNotExistsSkip>
<libs>
<!-- java11-->
<lib>${java.home}/jmods/java.base.jmod</lib>
<lib>${java.home}/jmods/java.datatransfer.jmod</lib>
<lib>${java.home}/jmods/java.prefs.jmod</lib>
<lib>${java.home}/jmods/java.xml.jmod</lib>
<lib>${java.home}/jmods/java.desktop.jmod</lib>
<lib>${java.home}/jmods/</lib>
<!-- java8-->
<!--Put here your libraries if required-->
<!-- <lib>${java.home}/lib/rt.jar</lib>-->
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>com.guardsquare</groupId>
<artifactId>proguard-base</artifactId>
<version>7.5.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.guardsquare</groupId>
<artifactId>proguard-core</artifactId>
<version>9.1.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.wisetv.useroutbound.app.UserOutBoundApplication</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<unzip src="${project.build.directory}/${project.build.finalName}.jar"
dest="${project.build.directory}/extracted">
<patternset>
<include name="**/*"/>
</patternset>
</unzip>
<unzip src="${project.build.directory}/${project.build.finalName}-pg.jar"
dest="${project.build.directory}/extractedpg">
<patternset>
<include name="**/*"/>
</patternset>
</unzip>
<delete includeEmptyDirs="true">
<fileset dir="${project.build.directory}/extracted/BOOT-INF/classes">
<include name="**/*"/>
</fileset>
</delete>
<copy todir="${project.build.directory}/extracted/BOOT-INF/classes">
<!-- 指定源目录 -->
<fileset dir="${project.build.directory}/extractedpg/">
<!-- 如果需要,可以在这里指定文件过滤规则 -->
<include name="**/*"/>
</fileset>
</copy>
<mkdir dir="${project.build.directory}/temp-common"/>
<unzip src="${project.build.directory}/extracted/BOOT-INF/lib/iptvcrm-common-1.0-SNAPSHOT.jar"
dest="${project.build.directory}/temp-common"/>
<mkdir dir="${project.build.directory}/temp-security"/>
<unzip src="${project.build.directory}/extracted/BOOT-INF/lib/crmsecurity-1.0-SNAPSHOT.jar"
dest="${project.build.directory}/temp-security"/>
<!-- Step 3: Manually merge the application.properties files -->
<concat destfile="${project.build.directory}/extracted/BOOT-INF/classes/application_temp.properties" append="true">
<fileset dir="${project.build.directory}/temp-common/">
<include name="application.properties"/>
</fileset>
<fileset dir="${project.build.directory}/temp-security/">
<include name="application.properties"/>
</fileset>
<fileset dir="${project.build.directory}/extracted/BOOT-INF/classes">
<include name="application.properties"/>
</fileset>
</concat>
<concat destfile="${project.build.directory}/extracted/BOOT-INF/classes/application_temp.yml" append="true">
<fileset dir="${project.build.directory}/temp-common/">
<include name="application.yml"/>
</fileset>
<fileset dir="${project.build.directory}/temp-security/">
<include name="application.yml"/>
</fileset>
<fileset dir="${project.build.directory}/extracted/BOOT-INF/classes">
<include name="application.yml"/>
</fileset>
</concat>
<move file="${project.build.directory}/extracted/BOOT-INF/classes/application_temp.properties"
tofile="${project.build.directory}/extracted/BOOT-INF/classes/application.properties"/>
<move file="${project.build.directory}/extracted/BOOT-INF/classes/application_temp.yml"
tofile="${project.build.directory}/extracted/BOOT-INF/classes/application.yml"/>
<delete includeEmptyDirs="true">
<fileset dir="${project.build.directory}/extracted/BOOT-INF/lib/">
<include name="iptvcrm-common-1.0-SNAPSHOT.jar"/>
<include name="crmsecurity-1.0-SNAPSHOT.jar"/>
</fileset>
</delete>
<!-- Step 3: Repack the JAR using jar -cfM0 -->
<exec executable="jar">
<arg value="-cfM0"/>
<arg value="${project.build.directory}/${project.build.finalName}-final.jar"/>
<arg value="-C"/>
<arg value="${project.build.directory}/extracted"/>
<arg value="."/>
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<artifactId>useroutbound</artifactId>
<dependencies>
<dependency>
<groupId>com.wisetv</groupId>
<artifactId>iptvcrm-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.wisetv</groupId>
<artifactId>crmsecurity</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.5.Final</version>
</dependency>
<!-- Apache Commons Lang -->
<dependency>
<groupId>org.apache.commons</groupId>
<!-- 导入需要的 子包 -->
<artifactId>commons-lang3</artifactId>
<!-- 请根据需要替换为最新版本 -->
<version>3.12.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
</project>
最重要的是增加一个maven-compiler-plugin插件,把springboot的jar包格式转为标准的jar包格式
修改springboot启动类
因为混淆之后代码的函数名都会变成abcd之类的影响springboot加载
package com.wisetv.crmsecurity;
import com.wisetv.crmsecurity.util.SSLUtil;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootApplication
public class CrmsecurityApplication {
public static class CustomGenerator implements BeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return definition.getBeanClassName();
}
}
public static void main(String[] args) {
SpringApplicationBuilder sab=new SpringApplicationBuilder(CrmsecurityApplication.class)
.beanNameGenerator(new CustomGenerator());
sab.run(args);
SSLUtil.disableSSLVerification();
}
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允许cookies跨域
config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod("OPTIONS");// 允许提交请求的方法,*表示全部允许
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");// 允许Get的请求方法
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}