我使用的是带有maven和yguard(4.1.0)的spring boot 2.x,并且该项目被打包为war。 这个项目只有两个类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CustomerApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerApplication.class, args);
}
}
和
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(CustomerApplication.class);
}
}
yguard 的配置如下:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<id>obfuscate</id>
<configuration>
<target>
<property name="runtime_classpath" refid="maven.runtime.classpath"/>
<taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="${runtime_classpath}"/>
<yguard>
<inoutpair in="${project.build.directory}/test.war" out="${project.basedir}/wars/test.war" />
<rename mainclass="com.my.CustomerApplication"
logfile="${project.build.directory}/yguard.log.xml">
<keep>
<class name="com.my.ServletInitializer" classes="protected" methods="protected" fields="protected"/>
</keep>
</rename>
</yguard>
</target>
</configuration>
</execution>
</executions>
</plugin>
混淆后,我将war部署到tomcat上并启动,但是tomcat终端上没有打印spring boot的标志,并且有类似
org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath
的信息,而没有混淆的话应该是2 Spring WebApplicationInitializers detected on classpath
。
看来这次Spring Boot之战不被认作Spring Boot,为什么呢?
yguard日志如下:
<yguard version="1.5">
<expose>
<class name="com.my.CustomerApplication"/>
<method class="com.my.CustomerApplication" name="void main(java.lang.String[])"/>
<class name="com.my.ServletInitializer"/>
<method class="com.my.ServletInitializer" name="org.springframework.boot.builder.SpringApplicationBuilder configure(org.springframework.boot.builder.SpringApplicationBuilder)"/>
</expose>
<map>
</map>
</yguard>
yGuard 不支持 WAR 档案。您可能会丢失存档中包含的任何元数据。为了能够使用 yGuard 混淆的类创建 WAR 存档,您需要
processing示例演示了 Spring Boot JAR 的重新打包(即
BOOT_INF
中的应用程序类)。
此外,根据您的 yGuard 日志,yGuard 没有重命名任何内容。这支持了您正在丢失元数据的假设。
最后,您可能应该将(Spring)编译时依赖项传递给 yGuard 作为
externalclasses
。