Java 汤匙。不解析CtExecutableReference类型和声明的类型,具体取决于环境(Docker和本地Spring引导)

Java 汤匙。不解析CtExecutableReference类型和声明的类型,具体取决于环境(Docker和本地Spring引导),java,spring-boot,docker,inria-spoon,Java,Spring Boot,Docker,Inria Spoon,你好 我在Java项目中使用Spoon分析库时遇到了一个非常奇怪的问题。 我在运行相同的代码时得到不同的解析结果,这些代码在不同的环境中使用Spoon Launcher 1环境-从Intellij IDEA本地运行的Spring启动项目 2环境-与在Docker容器中运行的Spring Boot项目相同 在本地运行的Spring Boot项目中-一切正常,但是当我在Docker中运行相同的代码时-我在CtExecutableReference.getType()和CtExecutableRe

你好

我在Java项目中使用Spoon分析库时遇到了一个非常奇怪的问题。 我在运行相同的代码时得到不同的解析结果,这些代码在不同的环境中使用Spoon Launcher

  • 1环境-从Intellij IDEA本地运行的Spring启动项目
  • 2环境-与在Docker容器中运行的Spring Boot项目相同
在本地运行的Spring Boot项目中-一切正常,但是当我在Docker中运行相同的代码时-我在
CtExecutableReference.getType()和
CtExecutableReference.getDeclaredType()中得到
null

我在GitHub上发行了一期-

以下是详细信息

我的勺子版本是8.2.0。(来自maven repo)

我正试图从中解析(构建AST)代码 我在解析上有困难 这里有以下几行

。。。
@服务
公共服务{
私人价值重置价值重置价值;
专用队列;
@自动连线
公共价值服务(价值还原价值还原){
超级();
this.valuesRepository=valuesRepository;
this.queue=新建LinkedList();
}
公共列表getAllValues(){
列表值=新的ArrayList();
this.valuesRepository.findAll().forEach(values::add);
返回值;
}
...
}
在Docker中运行我的项目时,当我运行分析并尝试为
findAll()
方法
this.valuesResposition.findAll().forEach(values::add)
语句解析
CtExecutableReference
时,我得到
getType()
getDeclaredType()
值。
在本地运行时,
getType()
getDeclaredType()
都具有非空值

在解析其他项目中的其他类似代码块时,也会出现同样的问题。 比如说

@服务
公共类投注服务{
公共静态最终字符串日期\u格式\u NOW=“yyyy-MM-dd-HH”;
公共静态最终字符串日期\格式\现在\带有\小时\分钟=“yyyy-MM-dd HH:MM:ss”;
私人BetRepository;
@自动连线
公共投注服务(BetRepository BetRepository){
超级();
this.betRepository=betRepository;
}
公共列表getAllBets(){
列表下注=新建ArrayList();
this.betRepository.findAll().forEach(bets::add);
回注;
}
}
带有
this.betRepository.findAll()
的语句在Docker中运行时,在
getType
getDeclaredType
中都为null,但在本地环境中为ok

同时,在两种环境中都能很好地解析

公共类BetRepositoryTest{
@自动连线
私人测试管理者实体管理者;
@自动连线
私人BetRepository;
@试验
公开无效测试(){
下注=新下注(“2018-07-06 12:56”,“赢”,1033331082500.5);
entityManager.persist(bet);
entityManager.flush();
List bets=betRepository.findByCustomerId(bet.getCustomerId());
断言(bet.getCustomerId()==bets.get(0.getCustomerId());
}
}
语句
betRepository.findByCustomerId()
被解析为ok,并且在Docker和n本地Spring引导运行中都有必要的类型信息

当从IDE运行测试中的代码或从IDE启动Spring Boot项目,并通过从Web UI调用服务初始化分析时,我仔细检查了本地测试,一切正常,并按预期工作

但是,当我构建Docker映像时,type和declaredType中的值都为null

我使用以下代码运行Spoon分析

private SourceCodeMetamodel buildMetamodelForFiles(集合javaFiles){
Launcher spoonAPI=新启动器();
debug(“Spoon环境-{}”,ToStringBuilder.reflectionString(spoonAPI.getEnvironment());
debug(“Spoon模型生成器-{}”,ToStringBuilder.reflectionString(spoonAPI.getModelBuilder());
Set inputResources=new HashSet();
for(文件javaFile:javaFiles){
字符串javaDir=JavaFileUtils.getJavaFileStorageRootPath(javaFile);
if(StringUtils.isNotBlank(javaDir)&&!inputResources.contains(javaDir)){
spoonAPI.addInputResource(javaDir);
add(javaDir);
}
else if(StringUtils.isBlank(javaDir)){
spoonAPI.addInputResource(javaFile.getAbsolutePath());
}
}
spoonAPI.buildModel();
CtModel CtModel=spoonAPI.getModel();

Collection当我通过将Spoon Launcher日志设置为“ALL”来启用它时,我发现了一些线索

这是我在Docker环境中得到的

CA_CERTIFICATES_JAVA_VERSION : 20140324
HOME : /root
HOSTNAME : e297584466e8
JAVA_DEBIAN_VERSION : 8u111-b14-2~bpo8+1
JAVA_HOME : /usr/lib/jvm/java-8-openjdk-amd64
JAVA_VERSION : 8u111
LANG : C.UTF-8
PATH : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PID : 8
PROFILE : prod
PWD : /
awt.toolkit : sun.awt.X11.XToolkit
file.encoding : UTF-8
file.encoding.pkg : sun.io
file.separator : /
java.awt.graphicsenv : sun.awt.X11GraphicsEnvironment
java.awt.headless : true
java.awt.printerjob : sun.print.PSPrinterJob
java.class.path : /maven/skillcounters-skill-service-1.0-SNAPSHOT.jar
java.class.version : 52.0
java.endorsed.dirs : /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/endorsed
java.ext.dirs : /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/java/packages/lib/ext
java.home : /usr/lib/jvm/java-8-openjdk-amd64/jre
java.io.tmpdir : /tmp
java.library.path : /usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
java.protocol.handler.pkgs : org.springframework.boot.loader
java.runtime.name : OpenJDK Runtime Environment
java.runtime.version : 1.8.0_111-8u111-b14-2~bpo8+1-b14
java.security.egd : file:/dev/./urandom
java.specification.name : Java Platform API Specification
java.specification.vendor : Oracle Corporation
java.specification.version : 1.8
java.vendor : Oracle Corporation
java.vendor.url : http://java.oracle.com/
java.vendor.url.bug : http://bugreport.sun.com/bugreport/
java.version : 1.8.0_111
java.vm.info : mixed mode
java.vm.name : OpenJDK 64-Bit Server VM
java.vm.specification.name : Java Virtual Machine Specification
java.vm.specification.vendor : Oracle Corporation
java.vm.specification.version : 1.8
java.vm.vendor : Oracle Corporation
java.vm.version : 25.111-b14
。。。
在/opt/skillcounters/filestorage/github/vipinjo/assignment consumer/work tree/d4e050cf3566981ba386e36c5889f8d107abfbb/src/main/java/com/vipinjoseph/assignmentconsumer/service/ValueServices.java:32处未定义类型值resposition的findAll()方法
在本地环境中,这些警告不会显示

有一些类路径问题类似于

经过将近一天的努力,我找到了一个解决办法

  • 使用Spoon 9.0.0或更高版本的fix
  • 从Spoon Launcher使用父类加载器创建类加载器
  • 将每个*.jar文件直接包含到类加载器URL类路径中(不是包含jar的目录,而是传递给类加载器的单个URL中的每个jar)
  • 将此类加载器设置为InputClassLoader
  • URLClassLoader URLClassLoader=URLClassLoader.newInstance(
    JarURL.toArray(新URL[0])
    ,spoonAPI.getClass().getClassLoader()
    
    CA_CERTIFICATES_JAVA_VERSION : 20140324
    HOME : /root
    HOSTNAME : e297584466e8
    JAVA_DEBIAN_VERSION : 8u111-b14-2~bpo8+1
    JAVA_HOME : /usr/lib/jvm/java-8-openjdk-amd64
    JAVA_VERSION : 8u111
    LANG : C.UTF-8
    PATH : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    PID : 8
    PROFILE : prod
    PWD : /
    awt.toolkit : sun.awt.X11.XToolkit
    file.encoding : UTF-8
    file.encoding.pkg : sun.io
    file.separator : /
    java.awt.graphicsenv : sun.awt.X11GraphicsEnvironment
    java.awt.headless : true
    java.awt.printerjob : sun.print.PSPrinterJob
    java.class.path : /maven/skillcounters-skill-service-1.0-SNAPSHOT.jar
    java.class.version : 52.0
    java.endorsed.dirs : /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/endorsed
    java.ext.dirs : /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/java/packages/lib/ext
    java.home : /usr/lib/jvm/java-8-openjdk-amd64/jre
    java.io.tmpdir : /tmp
    java.library.path : /usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib
    java.protocol.handler.pkgs : org.springframework.boot.loader
    java.runtime.name : OpenJDK Runtime Environment
    java.runtime.version : 1.8.0_111-8u111-b14-2~bpo8+1-b14
    java.security.egd : file:/dev/./urandom
    java.specification.name : Java Platform API Specification
    java.specification.vendor : Oracle Corporation
    java.specification.version : 1.8
    java.vendor : Oracle Corporation
    java.vendor.url : http://java.oracle.com/
    java.vendor.url.bug : http://bugreport.sun.com/bugreport/
    java.version : 1.8.0_111
    java.vm.info : mixed mode
    java.vm.name : OpenJDK 64-Bit Server VM
    java.vm.specification.name : Java Virtual Machine Specification
    java.vm.specification.vendor : Oracle Corporation
    java.vm.specification.version : 1.8
    java.vm.vendor : Oracle Corporation
    java.vm.version : 25.111-b14