1818package cn .polarismesh .agent .core .asm .instrument .plugin ;
1919
2020import cn .polarismesh .agent .core .common .conf .ConfigManager ;
21+ import cn .polarismesh .agent .core .common .logger .CommonLogger ;
22+ import cn .polarismesh .agent .core .common .logger .StdoutCommonLoggerFactory ;
2123import cn .polarismesh .agent .core .common .utils .StringUtils ;
24+
25+ import java .io .IOException ;
2226import java .util .Collections ;
2327import java .util .HashSet ;
2428import java .util .Set ;
29+ import java .util .jar .JarFile ;
30+ import java .util .jar .Manifest ;
2531
2632public class PluginNameFilter implements PluginFilter {
2733
34+ private static final CommonLogger logger = StdoutCommonLoggerFactory .INSTANCE
35+ .getLogger (PluginNameFilter .class .getCanonicalName ());
36+
2837 private final Set <String > pluginNames ;
2938
3039 public PluginNameFilter () {
@@ -38,6 +47,9 @@ public boolean accept(PluginJar pluginJar) {
3847
3948 private static Set <String > getLoadablePluginNames () {
4049 String enablePlugins = ConfigManager .INSTANCE .getConfigValue (ConfigManager .KEY_PLUGIN_ENABLE );
50+ logger .info ("Enable plugins: " + enablePlugins );
51+ enablePlugins = appendSpringCloudPluginNameIfNeeded (enablePlugins );
52+ logger .info ("Enable plugins after appendSpringCloudPluginNameIfNeeded: " + enablePlugins );
4153 if (StringUtils .isEmpty (enablePlugins )) {
4254 return Collections .emptySet ();
4355 }
@@ -51,4 +63,63 @@ private static Set<String> getLoadablePluginNames() {
5163 }
5264 return values ;
5365 }
66+
67+ private static String appendSpringCloudPluginNameIfNeeded (String enablePlugins ) {
68+ if (StringUtils .hasText (enablePlugins )) {
69+ String [] names = enablePlugins .split ("," );
70+ for (String name : names ) {
71+ if (StringUtils .hasText (name ) && name .contains ("spring-cloud-" )) {
72+ return enablePlugins ;
73+ }
74+ }
75+ }
76+
77+ JarFile jarFile = null ;
78+ try {
79+ String classPath = System .getProperty ("java.class.path" );
80+ logger .info ("Class path: " + classPath );
81+ String [] paths = classPath .split (":" );
82+ String mainJarPath = paths [0 ];
83+ logger .info ("Main jar: " + mainJarPath );
84+ jarFile = new JarFile (mainJarPath );
85+ Manifest manifest = (jarFile ).getManifest ();
86+ String versionStr = manifest .getMainAttributes ().getValue ("Spring-Boot-Version" );
87+ logger .info ("Spring Boot Version: " + versionStr );
88+ String springCloudPluginNamePattern = "spring-cloud-%s-plugin" ;
89+ String springCloudVersion = "" ;
90+ if (versionStr .startsWith ("2.2" ) || versionStr .startsWith ("2.3" )) {
91+ springCloudVersion = "hoxton" ;
92+ } else if (versionStr .startsWith ("2.4" ) || versionStr .startsWith ("2.5" )) {
93+ springCloudVersion = "2020" ;
94+ } else if (versionStr .startsWith ("2.6" ) || versionStr .startsWith ("2.7" )) {
95+ springCloudVersion = "2021" ;
96+ } else if (versionStr .startsWith ("3.0" ) || versionStr .startsWith ("3.1" )) {
97+ springCloudVersion = "2022" ;
98+ } else if (versionStr .startsWith ("3.2" ) || versionStr .startsWith ("3.3" )) {
99+ springCloudVersion = "2023" ;
100+ }
101+ if (StringUtils .hasText (springCloudVersion )) {
102+ String springCloudPluginName = String .format (springCloudPluginNamePattern , springCloudVersion );
103+ logger .info ("Spring Cloud Version: " + springCloudVersion );
104+ if (StringUtils .hasText (enablePlugins )) {
105+ enablePlugins = enablePlugins + "," + springCloudPluginName ;
106+ } else {
107+ enablePlugins = springCloudPluginName ;
108+ }
109+ } else {
110+ logger .warn ("No compatible Spring Cloud version found for Spring Boot version: " + versionStr );
111+ }
112+ } catch (IOException ioException ) {
113+ logger .warn ("Cannot get Spring Boot Version from MANIFEST." , ioException );
114+ } finally {
115+ if (jarFile != null ) {
116+ try {
117+ jarFile .close ();
118+ } catch (IOException ioException ) {
119+ logger .warn ("Cannot close jarFile" , ioException );
120+ }
121+ }
122+ }
123+ return enablePlugins ;
124+ }
54125}
0 commit comments