Giter Club home page Giter Club logo

java-callgraph2's Introduction

Maven Central

1. 说明

java-callgraph2项目原本fork自https://github.com/gousiosg/java-callgraph

后来进行了优化和增强,差别已比较大,不容易合并回原始项目中,且仅提供通过静态分析获取Java方法调用关系的功能,因此创建了该项目。

当前项目提供了插件功能,可用于为Java代码自动生成UML时序图,可参考https://github.com/Adrninistrator/gen-java-code-uml-sequence-diagram

2. 使用说明

2.1. 编译方式

执行以下命令

gradlew jar

2.2. 执行方式

执行命令可参考脚本文件run.batrun.sh

2.2.1. 程序主类

com.adrninistrator.javacg.stat.JCallGraph

2.2.2. 程序参数(Program arguments)

用于指定需要解析的jar/war包或目录路径列表,支持指定一个或多个jar包或目录的路径(指定目录时,会处理其中的class或jar文件)

当指定目录时,或指定多个jar文件时,会合并成一个jar包后再处理,文件名为第一个jar/war包加上“-javacg_merged.jar”

示例如下:

out
build/libs/a.jar
build/libs/a.jar build/libs/b.jar
out build/libs/a.jar build/libs/b.jar

2.2.3. JVM选项(VM options)

  • merge.class.in.jar.package(需要合并的包名)

当前参数用于指定合并jar/war包中的class文件时,需要合并的包名

假如未指定当前参数,或当前参数值为空,则合并jar/war包中的class文件时,对所有的class文件都进行合并

假如当前参数值非空,则合并jar/war包中的class文件时,仅对包名满足该参数值的class文件进行合并(即包名不满足该参数值的class文件不合并到新的jar包中)

当前参数值支持指定一个或多个需要合并的包名,多个包名之间使用“#”分隔

-Dmerge.class.in.jar.package=aa.bb.cc
-Dmerge.class.in.jar.package=aa.bb.cc#tt.cc.ss#cc.mm.

通过以上参数指定需要合并的包名时,除了对jar/war包根目录的class文件进行处理外,还会对“WEB-INF/classes/”、“BOOT-INF/classes/”目录中的class文件进行处理,分别对应war包中的class文件,Spring Boot Maven Plugin插件生成的jar包

  • input.root.path

指定保存配置文件的根目录

3. 生成可以直接执行的文件

3.1. 编译方式

执行以下命令

gradlew gen_run_jar

3.2. 执行方式

执行以上命令后,会在output_dir目录中生成可以直接执行的文件

在Windows/Linux等操作系统中分别执行对应的脚本文件run.batrun.sh

通过参数1指定需要处理的jar包文件路径或目录路径,如下所示:

run.bat a.jar
sh run.sh a.jar

4. 输出文件格式

输出文件格式

方法调用类型

4.1. 方法调用关系文件

方法调用关系文件生成在指定的第一个jar包所在目录中(若第一个是目录则在该目录中),文件名为第一个jar包或合并后的jar包加上“.txt”

文件各字段之间使用空格作为分隔符

4.1.1. jar包/目录信息

jar包/目录信息以“J:”或“D:”开头,格式如下所示:

J:jar_number jar包文件绝对路径

java-callgraph2输出的目录信息格式如下所示:

D:jar_number 目录绝对路径

以上jar_number代表当前jar包或目录的唯一序号,由于可能存在重复文件不会处理,因此该序号不一定连续

某个jar包/目录信息到下一个jar包/目录信息或文件结尾之间的类引用关系及方法调用关系,代表存在于当前的jar包或目录中

4.1.2. 类引用关系

类引用关系以“C:”开头,格式如下所示:

C:caller_class callee_class
  • caller_class

代表当前类的完整类名

  • callee_class

代表被当前类引用的类的完整类名

4.1.3. 方法调用关系

方法调用关系以“M:”开头,格式如下所示:

M:call_id class1:<method1>(arg_types) (typeofcall)class2:<method2>(arg_types) line_number jar_number
  • call_id

代表当前方法调用的ID

  • typeofcall

原始java-callgraph支持的调用类型typeofcall如下:

typeofcall 含义
M invokevirtual
I invokeinterface
O invokespecial
S invokestatic
D invokedynamic

java-callgraph2增加的调用类型typeofcall如下:

typeofcall 含义
ITF 接口与实现类方法
RIR Runnable实现类线程调用
CIC Callable实现类线程调用
TSR Thread子类线程调用
LM lambda表达式
SCC 父类调用子类的实现方法
CCS 子类调用父类的实现方法
MA 人工添加的方法调用关系
  • line_number

为当前调用者方法源代码对应行号

  • jar_number

jar包唯一序号,从1开始

4.2. 注解信息文件

注解信息文件生成目录与以上文件相同,文件名为第一个jar包或合并后的jar包加上“-annotation.txt”

文件各字段之间使用空格作为分隔符

文件格式如下:

type class_or_method_name annotation_name annotation_attribute_name annotation_attribute_value
  • type

“C:”代表为类上的注解信息

“M:”代表为方法上的注解信息

  • class_or_method_name

当前行为类上的注解信息时,该字段值为完整类名

当前行为方法上的注解信息时,该字段值为完整方法名(完整类名+方法名+方法参数)

  • annotation_name

注解的完整类名

  • annotation_attribute_name

注解属性的名称,可能为空

  • annotation_attribute_value

注解属性值,与AnnotationAttributesFormatorInterface实现类的处理方式有关,可能为空

若注解没有属性值,则只有以上前三个字段,占一行

若注解有属性值,则有以上五个字段,每个属性占一行

使用java-all-call-graph中的AllAnnotationAttributesFormator类时,注解属性值前缀的含义如下:

注解属性值前缀 含义 属性值的保存格式
s: 字符串类型,对应简单类型、类、枚举类型 属性值为字符串
b: 字符串类型,对应简单类型、类、枚举类型,进行BASE64编码 属性值为字符串BASE64编码后的结果
m: Map类型,对应注解类型 属性值为JSON字符串
l: List类型,对应数组类型 属性值为JSON字符串

文件示例如下:

C: test.call_graph.annotation.MethodWithAnnotation test.call_graph.annotation.TestAnnotation strValue b:YWFhDQo=
C: test.call_graph.annotation.MethodWithAnnotation test.call_graph.annotation.TestAnnotation intValue s:111
C: test.call_graph.annotation.MethodWithAnnotation test.call_graph.annotation.TestAnnotation intArrayValue l:["1","2","3","4"]
C: test.call_graph.annotation.MethodWithAnnotation test.call_graph.annotation.TestAnnotation annotation1 m:{"valueB":"Cvb1","valueA":"Cva1"}
M: test.call_graph.annotation.MethodWithAnnotation:test2() test.call_graph.annotation.TestAnnotationOuter annotations l:[{"valueB":"vb1\r\n","valueA":"va1"},{"valueB":"va2","valueA":"va2"}]
M: test.call_graph.annotation.MethodWithAnnotation:test3() test.call_graph.annotation.TestAnnotationOuter2 annotations l:[{"value":"aaa","annotations":[{"valueB":"va1","valueA":"va1"},{"valueB":"va2\r\n","valueA":"va2"}]},{"value":"bbb","annotations":[{"valueB":"vb1","valueA":"vb1"},{"valueB":"vb2","valueA":"vb2"}]}]

4.3. 方法代码行号信息文件

方法代码行号信息文件生成目录与以上文件相同 ,文件名为第一个jar包或合并后的jar包加上“-line_number.txt”

文件各字段之间使用空格作为分隔符

对于接口中定义的未实现的方法,或抽象方法等,无法获取到代码行号信息

文件格式如下:

full_method min_line_number max_line_number
  • full_method

完整方法(类名+方法名+参数)

  • min_line_number

起始代码行号

  • max_line_number

结束代码行号

文件示例如下:

com.adrninistrator.javacg.util.HandleJarUtil:<init>() 337 338
com.adrninistrator.javacg.util.JavaCGUtil:isInnerAnonymousClass(java.lang.String) 28 37
com.adrninistrator.javacg.util.JavaCGUtil:isNumStr(java.lang.String) 41 51

5. 扩展功能

参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/extensions.md中的相关内容

6. 更新说明

6.1. (0.1.2)

  • 支持对目录进行处理

支持对目录中的class、jar/war文件进行处理

支持在启动参数中指定一个或多个jar/war包或目录

在处理时,会将指定的jar/war包及指定目录合并为一个新的jar包后再处理:

a. 对于指定的jar/war包及指定目录中的后缀为.jar/.war的文件,将其中的class文件进行合并

b. 对于指定目录中的后缀非.jar/.war的文件进行合并

合并jar/war包中的class文件时,支持仅将指定包名的class文件合并到新的jar包中

合并产生的新jar包信息如下:

保存在指定的第一个jar/war包所在目录中(若第一个是目录则在该目录中)

文件名为第一个jar/war包加上“-javacg_merged.jar”

第一层目录为每个被合并的.jar/.war文件或目录的名称

  • 支持插件功能

提供用于生成Java方法UML时序图的插件功能

  • 输出文件路径指定方式变化

不再通过JVM选项“-Doutput.file=”指定输出文件路径,默认将输出文件生成在指定的第一个jar包所在目录中(若第一个是目录则在该目录中)

方法调用关系文件名为第一个jar包或合并后的jar包加上“.txt”

注解信息文件名为第一个jar包或合并后的jar包加上“-annotation.txt”

6.2. (0.1.3)

生成的注解信息文件中增加类上的注解信息,包含注解名称、注解属性名称及属性值;增加方法上的注解的注解属性名称及属性值

6.3. (0.1.5)

在对类进行处理时,跳过重复同名类

6.4. (0.1.7)

支持人工添加缺失的方法调用关系(定制化代码开发)

具体说明可参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/extensions.md中的相关内容

6.5. (0.1.8)

生成方法代码行号信息文件,文件名以“-line_number.txt”结尾

6.6. (0.1.9)

对于某个类调用自身类的类调用关系,也会生成在输出文件中

6.7. (0.2.0)

在处理注解的属性值时,支持使用自定义类处理,自定义类需要实现com.adrninistrator.javacg.extensions.annotation_attributes.AnnotationAttributesFormatorInterface接口

可使用java-all-call-graph中的com.adrninistrator.jacg.extensions.annotation_attributes.AllAnnotationAttributesFormator

6.8. (0.2.1)

对于接口之间的继承关系,在内存中进行记录

6.9. (0.2.2)

方法调用对象中增加字段

6.10. (1.0.0)临时说明

  • 指定需要合并的包名时增加支持目录

通过merge.class.in.jar.package参数指定需要合并的包名时,增加对“BOOT-INF/classes/”目录中的class文件进行处理,对应Spring Boot Maven Plugin插件生成的jar包 参数换了

  • 支持TimeTask构造函数调用run方法

  • 增加配置文件及参数

config.properties
jar_dir.properties
packages.properties
  • 支持通过代码指定配置参数

  • 支持获取方法调用中使用的参数值、被调用对象类型等

6.11. (1.0.16)临时说明

在输出的method_call文件中,增加增加调用方法返回类型,使被调用方法返回类型更准确

7. 原始java-callgraph调用关系缺失的场景

原始java-callgraph在多数场景下能够获取到Java方法调用关系,但以下场景的调用关系会缺失:

  • 接口与实现类方法

假如存在接口Interface1,及其实现类Impl1,若在某个类Class1中引入了接口Interface1,实际为实现类Impl1的实例(使用Spring时的常见场景),在其方法Class1.func1()中调用了Interface1.fi()方法;

原始java-callgraph生成的方法调用关系中,只包含Class1.func1()调用Interface1.fi()的关系,Class1.func1()调用Impl1.fi(),及Impl1.fi()向下调用的关系会缺失。

  • Runnable实现类线程调用

假如f1()方法中使用内部匿名类形式的Runnable实现类在线程中执行操作,在线程中执行了f2()方法,如下所示:

private void f1() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            f2();
        }
    }).start();
}

原始java-callgraph生成的方法调用关系中,f1()调用f2(),及f2()向下调用的关系会缺失;

对于使用命名类形式的Runnable实现类在线程中执行操作的情况,存在相同的问题,原方法调用线程中执行的方法,及继续向下的调用关系会缺失。

  • Callable实现类线程调用

与Runnable实现类线程调用情况类似,略。

  • Thread子类线程调用

与Runnable实现类线程调用情况类似,略。

  • lambda表达式(含线程调用等)

假如f1()方法中使用lambda表达式的形式在线程中执行操作,在线程中执行了f2()方法,如下所示:

private void f1() {
    new Thread(() -> f2()).start();
}

原始java-callgraph生成的方法调用关系中,f1()调用f2(),及f2()向下调用的关系会缺失;

对于其他使用lambda表达式的情况,存在相同的问题,原方法调用lambda表达式中执行的方法,及继续向下的调用关系会缺失。

  • Stream调用

在使用Stream时,通过xxx::func方式调用方法,原始java-callgraph生成的方法调用关系中会缺失。如以下示例中,当前方法调用当前类的map2()、filter2(),及TestDto1类的getStr()方法的调用关系会缺失。

list.stream().map(this::map2).filter(this::filter2).collect(Collectors.toList());
list.stream().map(TestDto1::getStr).collect(Collectors.toList());
  • 父类调用子类的实现方法

假如存在抽象父类Abstract1,及其非抽象子类ChildImpl1,若在某个类Class1中引入了抽象父类Abstract1,实际为子类ChildImpl1的实例(使用Spring时的常见场景),在其方法Class1.func1()中调用了Abstract1.fa()方法;

原始java-callgraph生成的方法调用关系中,只包含Class1.func1()调用Abstract1.fa()的关系,Class1.func1()调用ChildImpl1.fa()的关系会缺失。

  • 子类调用父类的实现方法

假如存在抽象父类Abstract1,及其非抽象子类ChildImpl1,若在ChildImpl1.fc1()方法中调用了父类Abstract1实现的方法fi();

原始java-callgraph生成的方法调用关系中,ChildImpl1.fc1()调用Abstract1.fi()的关系会缺失。

针对以上问题,java-callgraph2都进行了优化,能够生成缺失的调用关系。

java-callgraph2地址为https://github.com/Adrninistrator/java-callgraph2

对于更复杂的情况,例如存在接口Interface1,及其抽象实现类Abstract1,及其子类ChildImpl1,若在某个类中引入了抽象实现类Abstract1并调用其方法的情况,生成的方法调用关系中也不会出现缺失。

java-callgraph2's People

Contributors

adrninistrator avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

java-callgraph2's Issues

@Autowire场景查找spring注入类型有误

@autowire优先找到类型符合的bean。但是在下例中,会错误得找到LoginService

public class LoginNewController {
    @Autowired
    private LoginNewService loginService;

    public void login() {
        loginService.login();
    }
}

@Service
public class LoginService {
    public void login() {

    }
}

@Service
public class LoginNewService {
    public void login() {

    }
}

关于类的继承/实现中泛型参数的关系

例如有三个类:

public interface BaseMapper<T> {}

public interface CommonMapper<S, T> extends BaseMapper<T> {}

public interface TestMapper extends CommonMapper<String, Integer> {}

按照当前的实现,jacg_class_signature_ei1表中会记录TestMapper的泛型参数:

seq sign_class_name
0 java.lang.String
1 java.lang.Integer

我觉得可以加一张表,记录下CommonMapperBaseMapper的泛型参数的关系:

seq upward_seq
1 0
  • seq 当前类的泛型参数下标
  • upward_seq 对应父类/接口的泛型参数下标

这样我们才能知道,TestMapper是一个BaseMapper<Integer>

Error: Could not find or load main class :jar.batik-all.jar:jar.xml-apis-ext.jar

When trying to generate a dynamic call graph for my spring boot project I got this error:
Error: Could not find or load main class :jar.batik-all.jar:jar.xml-apis-ext.jar

1- The command that I ran:
java -Xbootclasspath:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar:jar/batik-all.jar:jar/xml-apis-ext.jar -javaagent:target/javacg-0.1-SNAPSHOT-dycg-agent.jar="incl=org.apache.batik.,org.w3c.;" -jar dacapo-9.12-bach.jar batik -s small | tail -n 10

2- The example that I followed:
https://github.com/gousiosg/java-callgraph#examples

接口Interface1,及其抽象实现类Abstract1,及其子类ChildImpl1,某个类中引入了接口Interface1并调用其方法的情况,调用关系缺失

@service
public class StateManager {
@resource(name = "stateProcessor")
private StateProcessor processor;
public void setState(StateContext context, OrderStateEnum targetState) {
switch (targetState) {
case UNPAID:
processor.onUnpaid(context);
}
}
}

public class StateProcessorProxy implements StateProcessor {
@OverRide
public void onUnpaid(StateContext context) throws BizException {
StateProcessor processor = findProcessor(order);
processor.onUnpaid(context);
}

private StateProcessor findProcessor(GrabOrderVO order) {
       return processorTable.get(ProcessorEnum.GRAB_PROC.name());

}
}

<bean id="stateProcessor" class="com.xxx.StateProcessorProxy">
    <property name="processorTable">
        <map>
            <entry key="GRAB_PROC" value-ref="grabStateProcessor"/>
        </map>
    </property>
</bean>

public class GrabProcessor extends AbstractStateProcessor {
@OverRide
public void onUnpaid(StateContext context) {
}
}

public abstract class AbstractStateProcessor implements StateProcessor {
}
GrabProcessor 继承 AbstractStateProcessor 实现 StateProcessor
StateProcessorProxy 实现 StateProcessor
入口:StateManager,setState方法,case UNPAID:分支
预期调用链路:
1、StateManager-----setState方法--onUnpaid分支
2、StateProcessorProxy----onUnpaid方法
3、GrabProcessor----onUnpaid方法
实际调用链路:
1、StateManager-----setState方法--onUnpaid分支
2、StateProcessor----onUnpaid方法
3、StateProcessorProxy----onUnpaid方法
4、StateProcessor----onUnpaid方法

method_call 缺少7,9信息


2 org.apache.tools.ant.AntClassLoader$ResourceEnumeration:(org.apache.tools.ant.AntClassLoader,java.lang.String) (SPE)org.apache.tools.ant.AntClassLoader$ResourceEnumeration:findNextResource() 142 t void 1 1
缺少7 方法实际的返回类型

3 org.apache.tools.ant.AntClassLoader$ResourceEnumeration:nextElement() (SPE)java.util.NoSuchElementException:() 164 v void 1 -
缺少7 方法世纪的返回类型,而9被调用方,Jar包序号则显示为-

方法调用关系问题

EG代码:

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class TestObject extends ObjectInputStream {
    public TestObject(InputStream in) throws IOException {
        super(in);
    }
}

public class Test{
    public void test() throws Exception{
        TestObject testObject = new TestObject(null);
        testObject.readObject();
    }
}
Test:test()	(SPE)TestObject:<init>(java.io.InputStream)	5	void	v	void		1	1
Test:test()	(VIR)TestObject:readObject()	6	void	v	java.lang.Object		1	1
TestObject:<init>(java.io.InputStream)	(SPE)java.io.ObjectInputStream:<init>(java.io.InputStream)	9	void	t	void		1	-

从结果中只能得出调用了父类方法,method_call里面能否加入一个TestObject:readObject() 调用java.io.ObjectInputStream:readObject()

再比如:

net.sf.jasperreports.engine.util.JRLoader:loadObject(java.io.File)	(_ACT_C)net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject()	90	java.lang.Object	v	java.lang.Object		1	1

image

image

net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject() 在method_call中查不到调用了java.io.ObjectInputStream:readObject()

如何直接调用工具API?

作者您好,我现在想直接生成某个maven项目的所有测试用例的静态调用图,不想通过命令行运行的方式获取txt文件,如何通过代码调用您这个工具的某个API,直接获取存储method call的数据结构呢?然后我可以直接从这个数据结构获取我想要的method call信息。

无法运行run.sh

./run.sh ./android-23.jar
錯誤: 找不到或無法載入主要類別 com.adrninistrator.javacg.stat.JCallGraph
原因: java.lang.ClassNotFoundException: com.adrninistrator.javacg.stat.JCallGraph

如何进行源代码级别的处理?

如何进行源代码级的处理,假设我现在有如下.java文件,我想得到他的调用关系,但是我不想编译为.class或.jar,本项目是否支持?
public class Test { public static void main(String[] args) { String str = fun1(61, "asd"); System.out.println("str = " + str); } private static String fun1(int i, String asd) { if (i > 10){ return fun2(i * 10) + asd; } return fun3((int)(i * 0.1)) + asd; } private static String fun2(int i) { return fun3(i); } private static String fun3(int v) { return v * 10 + ""; } }

代码中使用接口的方法调用没有解析到对应的实现类的方法调用

源码如下:

interface User{
    public String getName();
    public void setName(String name);
    public void sayHello();
}

class Student implements User{
    private String name;
    public String getName(){
        return name;
    }

    public void setName(String cname){
        name = cname;
    }
    private void secret(){
        System.out.println("secret");
    }

    public void sayHello(){
        System.out.println("hello, " + name);
        secret();
    }
}
public class UrlArgParser {
    public static void main(String args[]){
        User a = new Student();
        a.setName("great");
        a.sayHello();
    }
}

生成的调用链如下:

C:StudentStudent
C:Student User
C:Student java.io.PrintStream
C:Student java.lang.StringBuilder
C:Student java.lang.System
M:1 Student:<init>() (O)java.lang.Object:<init>() 12 1
M:2 Student:secret() (M)java.io.PrintStream:println(java.lang.String) 22 1
M:3 Student:sayHello() (O)java.lang.StringBuilder:<init>() 26 1
M:4 Student:sayHello() (M)java.lang.StringBuilder:append(java.lang.String) 26 1
M:5 Student:sayHello() (M)java.lang.StringBuilder:append(java.lang.String) 26 1
M:6 Student:sayHello() (M)java.lang.StringBuilder:toString() 26 1
M:7 Student:sayHello() (M)java.io.PrintStream:println(java.lang.String) 26 1
M:8 Student:sayHello() (O)Student:secret() 27 1
C:UrlArgParser Student
C:UrlArgParser UrlArgParser
C:UrlArgParser User
M:9 UrlArgParser:<init>() (O)java.lang.Object:<init>() 30 1
M:10 UrlArgParser:main(java.lang.String[]) (O)Student:<init>() 35 1
M:11 UrlArgParser:main(java.lang.String[]) (I)User:setName(java.lang.String) 36 1
M:12 UrlArgParser:main(java.lang.String[]) (I)User:sayHello() 37 1

main中调用的User接口的sayHello方法未关联到Student实现类的sayHello方法

子类调用父类方法,后续路径缺失

版本1.0.11

public class AService extends BaseService{
    public String handle() {
        return baseHandle();
    }
}

public class BaseService {
    String baseHandle() {
        return getStr();
    }

    private String getStr() {
        return "123";
    }
}

BaseService:baseHandle()在method_call中记录的是AService:baseHandle()

2	org.testcase2.service.AService:handle()	(VIR)org.testcase2.service.AService:baseHandle()	5	t	java.lang.String		1	1

BaseService:baseHandle()的后续路径会丢失

Lombok注解无法解析出来,在method_annotaion.txt

@Data
public class LocaleProductMinPriceBO {

    /**
     * 产品id
     */
    private Long productId;

    /**
     * 售卖价格
     */
    private BigDecimal salePrice;
}

在method_info.txt中,是有这些方法的;但是在method_annotation.txt里却没有。

关于工具输入的问题

您好,请问这个工具只能处理jar包吗?能直接以字节码文件所在的文件夹作为输入吗?

新手村新手,环境问题

目前在ubuntu下,有gradle环境和openjdk version "16.0.1"
但是第一步编译就把我拦下来了,
编译:
gradlew jar
出错:

Command 'gradlew' not found, did you mean:

command 'gradle' from deb gradle (4.4.1-13)

Try: apt install

我就用
./gradlew jar

然后就
Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

  • Where:
    Build file '/root/data/java-callgraph2/build.gradle'

  • What went wrong:
    Could not compile build file '/root/data/java-callgraph2/build.gradle'.

startup failed:
General error during semantic analysis: Unsupported class file major version 60

java.lang.IllegalArgumentException: Unsupported class file major version 60
at groovyjarjarasm.asm.ClassReader.(ClassReader.java:196)
at groovyjarjarasm.asm.ClassReader.(ClassReader.java:177)
at groovyjarjarasm.asm.ClassReader.(ClassReader.java:163)
at groovyjarjarasm.asm.ClassReader.(ClassReader.java:284)
at org.codehaus.groovy.ast.decompiled.AsmDecompiler.parseClass(AsmDecompiler.java:81)
at org.codehaus.groovy.control.ClassNodeResolver.findDecompiled(ClassNodeResolver.java:251)
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:189)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:169)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:125)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClassNullable(AsmReferenceResolver.java:57)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveClass(AsmReferenceResolver.java:44)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveNonArrayType(AsmReferenceResolver.java:79)
at org.codehaus.groovy.ast.decompiled.AsmReferenceResolver.resolveType(AsmReferenceResolver.java:70)
at org.codehaus.groovy.ast.decompiled.MemberSignatureParser.createMethodNode(MemberSignatureParser.java:57)
at org.codehaus.groovy.ast.decompiled.DecompiledClassNode$2.get(DecompiledClassNode.java:234)
at org.codehaus.groovy.ast.decompiled.DecompiledClassNode$2.get(DecompiledClassNode.java:231)
at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.createMethodNode(DecompiledClassNode.java:242)
at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.lazyInitMembers(DecompiledClassNode.java:199)
at org.codehaus.groovy.ast.decompiled.DecompiledClassNode.getDeclaredMethods(DecompiledClassNode.java:122)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:912)
at org.codehaus.groovy.ast.ClassNode.tryFindPossibleMethod(ClassNode.java:1280)
at org.codehaus.groovy.control.StaticImportVisitor.transformMethodCallExpression(StaticImportVisitor.java:252)
at org.codehaus.groovy.control.StaticImportVisitor.transform(StaticImportVisitor.java:113)
at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:110)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:121)
at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53)
at org.codehaus.groovy.control.StaticImportVisitor.visitConstructorOrMethod(StaticImportVisitor.java:89)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructor(ClassCodeVisitorSupport.java:128)
at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1099)
at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:54)
at org.codehaus.groovy.control.StaticImportVisitor.visitClass(StaticImportVisitor.java:83)
at org.codehaus.groovy.control.CompilationUnit$14.call(CompilationUnit.java:708)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1084)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:640)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:618)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:595)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:401)
at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:89)
at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:341)
at groovy.lang.GroovyClassLoader$5.provide(GroovyClassLoader.java:338)
at org.codehaus.groovy.runtime.memoize.ConcurrentCommonCache.getAndPut(ConcurrentCommonCache.java:147)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:336)
at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileScript(DefaultScriptCompilationHandler.java:142)
at org.gradle.groovy.scripts.internal.DefaultScriptCompilationHandler.compileToDir(DefaultScriptCompilationHandler.java:98)
at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler$2.run(BuildOperationBackedScriptCompilationHandler.java:54)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.groovy.scripts.internal.BuildOperationBackedScriptCompilationHandler.compileToDir(BuildOperationBackedScriptCompilationHandler.java:51)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:152)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$CompileToCrossBuildCacheAction.execute(FileCacheBackedScriptClassCompiler.java:132)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:177)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:156)
at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:100)
at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:86)
at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:215)
at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:205)
at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:83)
at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:139)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:78)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:42)
at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:95)
at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68)
at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:126)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$RemapBuildScriptsAction.execute(FileCacheBackedScriptClassCompiler.java:435)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$RemapBuildScriptsAction.execute(FileCacheBackedScriptClassCompiler.java:403)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:177)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler$ProgressReportingInitializer.execute(FileCacheBackedScriptClassCompiler.java:156)
at org.gradle.cache.internal.DefaultPersistentDirectoryCache$Initializer.initialize(DefaultPersistentDirectoryCache.java:100)
at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess$1.run(FixedSharedModeCrossProcessCacheAccess.java:86)
at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:215)
at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:205)
at org.gradle.cache.internal.FixedSharedModeCrossProcessCacheAccess.open(FixedSharedModeCrossProcessCacheAccess.java:83)
at org.gradle.cache.internal.DefaultCacheAccess.open(DefaultCacheAccess.java:139)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:78)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.open(DefaultPersistentDirectoryStore.java:42)
at org.gradle.cache.internal.DefaultCacheFactory.doOpen(DefaultCacheFactory.java:95)
at org.gradle.cache.internal.DefaultCacheFactory.open(DefaultCacheFactory.java:68)
at org.gradle.cache.internal.DefaultCacheRepository$PersistentCacheBuilder.open(DefaultCacheRepository.java:126)
at org.gradle.groovy.scripts.internal.FileCacheBackedScriptClassCompiler.compile(FileCacheBackedScriptClassCompiler.java:105)
at org.gradle.groovy.scripts.internal.CrossBuildInMemoryCachingScriptClassCache.getOrCompile(CrossBuildInMemoryCachingScriptClassCache.java:50)
at org.gradle.groovy.scripts.internal.BuildScopeInMemoryCachingScriptClassCompiler.compile(BuildScopeInMemoryCachingScriptClassCompiler.java:50)
at org.gradle.groovy.scripts.DefaultScriptCompilerFactory$ScriptCompilerImpl.compile(DefaultScriptCompilerFactory.java:49)
at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:226)
at org.gradle.configuration.BuildOperationScriptPlugin$1$1.run(BuildOperationScriptPlugin.java:69)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:66)
at org.gradle.configuration.BuildOperationScriptPlugin$1.execute(BuildOperationScriptPlugin.java:63)
at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:49)
at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:63)
at org.gradle.configuration.project.BuildScriptProcessor$1.run(BuildScriptProcessor.java:45)
at org.gradle.internal.Factories$1.create(Factories.java:26)
at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:245)
at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:226)
at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:42)
at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35)
at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject$1.run(LifecycleProjectEvaluator.java:102)
at org.gradle.internal.Factories$1.create(Factories.java:26)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:189)
at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:271)
at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:265)
at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:226)
at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:91)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:63)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:707)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:143)
at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:36)
at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:61)
at org.gradle.configuration.BuildOperatingFiringProjectsPreparer$ConfigureBuild.run(BuildOperatingFiringProjectsPreparer.java:52)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.configuration.BuildOperatingFiringProjectsPreparer.prepareProjects(BuildOperatingFiringProjectsPreparer.java:40)
at org.gradle.initialization.DefaultGradleLauncher.prepareProjects(DefaultGradleLauncher.java:218)
at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:155)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:140)
at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:120)
at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:74)
at org.gradle.internal.invocation.GradleBuildController$1.create(GradleBuildController.java:67)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:189)
at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:67)
at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:56)
at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:63)
at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:51)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:45)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:50)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:80)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:47)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:60)
at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:38)
at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:68)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.base/java.lang.Thread.run(Thread.java:831)

1 error

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

貌似是安装java环境的版本不支持,我换了11
sudo apt install openjdk-11-jdk
这个不行,所以我该怎么办啊?
求贴主,帮我解答一下

指定目标是代码目录不是jar时,输出是空的。

您好,请问可以指定要处理的目标是一个项目目录吗,而不是jar包,我试了下,处理目标指定为这项目的src目录,就是”jar_dir.properties“设置的是当前项目的src,生成的结果都是空的,method_call.txt为空。实际上我是想用这个工具分析我Android的项目代码,我不知道这个是不是可行的,我试了下method_call一直是空。
image

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

在output_dir 中 执行 sh run.sh ,遇到以下错误
通过文件路径获取文件 _javacg_config/jar_dir.properties
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
at com.adrninistrator.javacg.util.JavaCGFileUtil.readFile2List(JavaCGFileUtil.java:239)
at com.adrninistrator.javacg.util.JavaCGFileUtil.readFile2List(JavaCGFileUtil.java:225)
at com.adrninistrator.javacg.conf.JavaCGConfigureWrapper.getOtherConfigList(JavaCGConfigureWrapper.java:212)
at com.adrninistrator.javacg.conf.JavaCGConfManager.getConfInfo(JavaCGConfManager.java:66)
at com.adrninistrator.javacg.stat.JCallGraph.run(JCallGraph.java:87)
at com.adrninistrator.javacg.stat.JCallGraph.main(JCallGraph.java:77)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
有解决办法吗?求助

为什么有的时候子类调用父类方法,method_call会有,有的时候却没有?

method_call可以写入的情况:

父类

public abstract class AbstractBaseHandler {
    public final TResponse handle(TRequest request) {
        try {
            init(request);
            preHandle();
            validate();
            doHandle();
            postHandle();
        } catch (RequestValidationFailureException e) {
            handleValidationFailure(e.getMessage(), tags);
        } catch (Exception e) {
            handleError(e, tags);
        } finally {
            clear();
        }
        return response;
    }

子类
childClass继承这个AbstractBaseHandler,
Code:
childClass.handle(request).

method_call:
childClass:handle(java.lang.Object)=> (_CCS)AbstractBaseHandler:handle(java.lang.Object)

method_call不可以写入的情况:

父类

public abstract class AbstractBaseHandlerextends SoaRequestProcessor {
	@Override
	public SoaResponseT process(SoaRequestT soaRequest) throws Exception {
		try {
			return super.process(soaRequest);
		} finally {
			InvokeContext.remove();
		}
	}
}

子类
childClass继承这个AbstractBaseHandler,
Code:
childClass.process(request).

method_call:
childClass:handle(java.lang.Object)=> (_CCS)AbstractBaseHandler:handle(java.lang.Object)

两者的区别:子类的实例化方式,第一种是new或者getBean出来的,第二种是@Autowired自动注入的


问题如题,感谢你的时间

关于@Resource type场景无法获取到SpringBeanTypeList

该场景下,UseSpringBeanByAnnotationHandler.doGetSpringBeanName 直接将类型作为 beanName(fieldSpringBeanType变量)返回,但后续 defineSpringBeanByAnnotationHandler.getSpringBeanTypeList() 仅根据 beanName 从 stringBeanNameAndTypeMap 中获取typeList, stringBeanNameAndTypeMap中没有将type作为key的数据。此时未获取到准确的type

如:
@service
public class Third1AuthService extends IAuthService {
}

@service
public class Third2AuthService extends IAuthService {
}

@service
public class Third3AuthService extends IAuthService {
}

@resource(type = Third1AuthService.class)
private IAuthService third01AuthService;

分析模式不同产生的结果内容存在不一致

你好
在使用过程中,我看到工具可以在配置文件中填入一个jar包的地址或者一个目录,如果是一个jar包会生成一个结果文件夹(模式A),但如果是多行jar包地址或者是目录则会先合成一个jar包再生成结果文件(模式B)。当我输入相同的多个jar包时,模式A得到多个结果文件夹,我将其中的method_call.txt汇总后得到的数据和我输入一个目录(目录下是和模式A相同的jar包)输出一个method_call.txt的内容存在差异,即两种模式分析出来的结果不同。
想请问这两种模式下出现不同结果的原因,十分感谢!

关于实现关系的 method_call 缺失和错误

使用过程中发现,对于继承关系,如:

public class A {
    public void exec() {}
}

public class B extends A {}

jacg_method_call中记录了子类方法对父类方法的调用关系:

B.exec 调用 A.exec

但是对于实现关系,如:

public interface A {
    default void exec() {}
}

public class B implements A {}

并没有记录子类方法对接口方法的调用关系。

是否可以添加这类调用关系?


特别地,对于多级实现关系,例如:

public interface A {
    default void exec() {}

    void test();
}

public interface B extends A {}

public class C implements B {
    public void test() {}
}

如果可以增加调用关系的话,首先必定要记录的是:

B.exec 调用 A.exec

至于C,建议记录:

C.exec 调用 B.exec

而不是:

C.exec 调用 A.exec

另外,目前的实现会生成两条调用关系:

B.test 调用 A.test(错误,应当是 A.test 调用 B.test)
B.test 调用 C.test

对于abstract class多级继承是否存在类似的问题,我尚未进行测试。

使用过程中的几点疑问

楼主好,刚接触这个项目,在使用过程中遇到了几点疑问,敬请方便的时候帮忙解答下,不胜感激:

  1. 是否可直接指定某个class文件
    目前遇到的问题,我在jar_dir.properties里面放了完成的.class文件的路径,例:D:***\core\payacq\controller\AcqProvideFopsController.class,得到了如下提示:【处理单个文件时只支持指定.jar或.war格式,假如需要处理.class格式的文件,则需要指定其所在目录】,请问需要如何指定目录
  2. 是否可以直接指定到某个class类下面的某个方法级别,只针对这个方法生成调用链
  3. 因为目前不知道该工具是否已经支持生成可视化的调用报告
    目前我是想用Graphviz来生成可视化的报告,首先在config.properties中设置为输出dot格式的文件:output.file.ext=.dot,但是发现生成的dot文件并不是dot的文件格式的,内容跟txt格式的一样,Graphviz无法直接转化,不知道是否是我漏了配置?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.