@@ -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