Java 汤匙。不解析CtExecutableReference类型和声明的类型,具体取决于环境(Docker和本地Spring引导)
你好 我在Java项目中使用Spoon分析库时遇到了一个非常奇怪的问题。 我在运行相同的代码时得到不同的解析结果,这些代码在不同的环境中使用Spoon LauncherJava 汤匙。不解析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
- 1环境-从Intellij IDEA本地运行的Spring启动项目
- 2环境-与在Docker容器中运行的Spring Boot项目相同
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