Skip to content

Commit 7dee8a6

Browse files
committed
feat: Enhancements to Decompiler #4
Enhanced Maven parsing capabilities to better identify dependencies. Add Decompiler#resolveModules Closes #4
1 parent c250ff4 commit 7dee8a6

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

src/main/kotlin/org/skgroup/securityinspector/utils/Decompiler.kt

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,18 @@ class Decompiler(private val project: Project) {
3232

3333
val dependencies2 = model.dependencyManagement.dependencies
3434

35-
val dependencies = dependencies1 + dependencies2
35+
var dependencies = dependencies1 + dependencies2
36+
37+
//需要考虑moudle嵌套的情况
38+
dependencies = resolveModules(projectBaseDir, model, dependencies as ArrayList<Dependency>)
3639

3740
dependencies.forEach { dependency ->
38-
if(dependency.version != null) {
41+
if (dependency.version != null) {
3942
//直接用version的时候拼接的是${},解析实际的值替换才能获取真正的jar
40-
dependency.version = model.properties.getProperty(dependency.version.replace("\${", "").replace("}", ""))
43+
var properties = model.properties
44+
dependency.version =
45+
model.properties.getProperty(dependency.version.replace("\${", "").replace("}", ""))
46+
?: dependency.version
4147
val jarFile = resolveJarFileFromDependency(dependency)
4248
if (jarFile != null && jarFile.exists()) {
4349
mavenJars.add(jarFile)
@@ -51,15 +57,17 @@ class Decompiler(private val project: Project) {
5157
fun getAllJars(): List<File> {
5258
val projectBaseDir = project.basePath ?: return emptyList()
5359
val libDir = File("$projectBaseDir/lib")
60+
val libsDir = File("$projectBaseDir/libs")
5461

5562
val libJars = libDir.listFiles { _, name -> name.endsWith(".jar") }?.toList() ?: emptyList()
63+
val libsJars = libsDir.listFiles { _, name -> name.endsWith(".jar") }?.toList() ?: emptyList()
5664

5765
val mavenJars = getMavenDependencies()
5866

5967
println("JAR files in lib directory: ${libJars.map { it.name }}")
6068
println("Maven JAR files: ${mavenJars.map { it.name }}")
6169

62-
return libJars + mavenJars
70+
return libJars + libsJars + mavenJars
6371
}
6472

6573
fun decompileJar(jarFile: File) {
@@ -95,6 +103,34 @@ class Decompiler(private val project: Project) {
95103
return File(mavenRepo, jarPath)
96104
}
97105

106+
//递归解析module的依赖
107+
fun resolveModules(basePath: String, model: Model, dependencies: ArrayList<Dependency>): ArrayList<Dependency> {
108+
val modules = model.modules
109+
val mavenReader = MavenXpp3Reader()
110+
modules.forEach { module ->
111+
val modulePath = "$basePath/$module"
112+
val modulePomFile = File("$modulePath/pom.xml")
113+
if (modulePomFile.exists()) {
114+
val moduleModel: Model = FileReader(modulePomFile).use { reader ->
115+
mavenReader.read(reader)
116+
}
117+
dependencies += moduleModel.dependencies
118+
dependencies.forEach { dependency ->
119+
if (dependency.version != null) {
120+
//直接用version的时候拼接的是${},解析实际的值替换才能获取真正的jar
121+
dependency.version =
122+
moduleModel.properties.getProperty(dependency.version.replace("\${", "").replace("}", ""))
123+
?: dependency.version
124+
}
125+
}
126+
if (moduleModel.modules.isNotEmpty()) {
127+
resolveModules(modulePath, moduleModel, dependencies)
128+
}
129+
}
130+
}
131+
return dependencies
132+
}
133+
98134
fun extractJarFile(jarFile: File, outputDir: File) {
99135
if (!outputDir.exists()) {
100136
outputDir.mkdirs()

0 commit comments

Comments
 (0)