介绍如何加密spring boot项目
介绍
一个 spring 程序被 Jar2Exe 加密后,2 个特性会失效:
- 任何一种component-scan都会失败:
程序无法自动查找和实例化@Serviceor@Controller或@Mapperbean。它无法根据通配符(例如classpath:/mapper/*.xml. - 任何一种@annotation都会失败:
如@Autowired或@Value将不起作用。
解决方案
由于不兼容的spring和encryption,我们选择程序的加密部分,并保留spring部分未加密:
- @Serviceclass:我们将服务类拆分为父类和子类:
父类是真正的服务类,业务代码要加密。它没有注释。
子类扩展父类,@Service自动扫描,@Autowired由 spring 注入。 - @Mapper class:它们是接口,我们不需要加密它们。
- mapper/xxx.xml: 有sql语句,如果要加密,需要一一显式声明。
- @Controllerclass:通常我们不需要加密。如果我们愿意,就像@Service课堂那样做。
- /static/并且/templates/,这些文件通过它们的名字被引用,加密兼容,如果我们想要加密。
- /application.properties,此文件按其名称使用,加密兼容。
项目结构
为了部分加密,我们将一个spring-boot项目拆分为3个项目,请参考demo项目:
- demo-web:原始的spring-boot项目,保持未加密。@Controller和@Service课程在里面。
- demo-core:要加密的。parent class的@Service是在这个项目。该项目是demo-web.
- demo-share:包含@Mapper类,保持未加密。为了让@Mapper类demo-core在开发过程中可以访问,作为demo-core.
使用 Jar2Exe 加密
mvn build在父目录运行,然后我们会得到结果/demo-web/target/demo-web-0.0.1-SNAPSHOT.jar:
- 首先,请下载最新的 Jar2Exev2.2.4或更高版本的 v2.2,v2.5.2或更高版本的 v2.5。
- 解压demo-web-0.0.1-SNAPSHOT.jar,我们会得到:
demo-web-0.0.1-SNAPSHOT
├── BOOT-INF
│ ├── classes
│ │ └── ………
│ └── lib
│ ├── ………
│ ├── demo-core-0.0. 1-SNAPSHOT.jar
│ ├── demo-share-0.0.1-SNAPSHOT.jar
│ └── ………
├── META-INF
│ ├── MANIFEST.MF
│ └── ………
└── org
└── springframework
└── boot
└── loader
└── ………
因为 Jar2Exe 已经提供了一个 ClassLoader,所以我们只需要下那些文件/BOOT-INF/而忽略其他文件。
3. 将下面的内容打包/BOOT-INF/classes/成一个 zip 或 jar 文件:
cd BOOT-INF/classes/
jar cvf ../classes.jar *
- 运行 Jar2Exe:
在步骤 1 中,选择/BOOT-INF/lib/demo-core-…jar作为主 jar。
第3步,输入com.regexlab.j2e.demo.DemoWebApplication为主类,点击时忽略警告Next。
在第 4 步,我们检查Encrypt and hide.
在第 5 步,我们添加BOOT-INF/classes.jar所有BOOT-INF/lib/*文件作为依赖项。保留…/classes.jar而demo-share-…jar 不是保护。至于其他的jar文件,我们不需要启用保护,因为如果我们选择更多的jar来保护它会减慢程序的启动速度。