antlers-lv opened a new issue, #7207:
URL: https://github.com/apache/seatunnel/issues/7207

   ### Search before asking
   
   - [X] I had searched in the 
[issues](https://github.com/apache/seatunnel/issues?q=is%3Aissue+label%3A%22bug%22)
 and found no similar issues.
   
   
   ### What happened
   
   After I changed the package of seatunnel-web from shade to fatjar, I started 
seatunnel-web as jar package, and the following problems occurred
   ``` java
   Caused by: java.lang.NoClassDefFoundError: 
org/apache/seatunnel/api/table/factory/TableSinkFactory
           at java.lang.ClassLoader.defineClass1(Native Method)
           at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
           at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
           at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
           at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
           at java.lang.Class.forName0(Native Method)
           at java.lang.Class.forName(Class.java:348)
           at 
java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:370)
           at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
           at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
           at java.util.Iterator.forEachRemaining(Iterator.java:116)
           at 
org.apache.seatunnel.api.table.factory.FactoryUtil.discoverFactories(FactoryUtil.java:242)
           at 
org.apache.seatunnel.app.thirdparty.framework.PluginDiscoveryUtil.getConnectorFeatures(PluginDiscoveryUtil.java:70)
           at 
org.apache.seatunnel.app.bean.connector.ConnectorCache.syncSourceFeature(ConnectorCache.java:136)
           at 
org.apache.seatunnel.app.bean.connector.ConnectorCache.refresh(ConnectorCache.java:132)
           at 
org.apache.seatunnel.app.bean.connector.ConnectorCache.<init>(ConnectorCache.java:73)
           at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
Method)
           at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
           at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
           at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
           at 
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)
           ... 27 common frames omitted
   Caused by: java.lang.ClassNotFoundException: 
org.apache.seatunnel.api.table.factory.TableSinkFactory
           at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
           ... 54 common frames omitted
   ```
   The problem I found is that seatunnel-plugin-discovery uses the 
URLClassLoader to find all connector extensions, but does not specify the 
parent for the URLClassLoader. Meanwhile, the current context uses Fatjar's 
LaunchedURLClassLOader, and the parent in URLClassLoader is set to the default 
application classloader Launcher@AppClassLoader. As a result, the 
Seatunnel-APi-related Class introduced into the jar package was not found when 
the SPI Load was performed.
   
   Finally, I think the URLClassloader should be built with the ClassLoader 
used by the main line as the parent. Of course I tried and solved the problem.
   
   such as  getAllPlugin method of AbstractPluginDiscovery
   
   ```java
   public Map<PluginType, LinkedHashMap<PluginIdentifier, OptionRule>> 
getAllPlugin()
               throws IOException {
           List<Factory> factories;
           if (this.pluginDir.toFile().exists()) {
               log.info("load plugin from plugin dir: {}", this.pluginDir);
               List<URL> files = FileUtils.searchJarFiles(this.pluginDir);
               factories =
                       FactoryUtil.discoverFactories(new 
URLClassLoader(files.toArray(new URL[0]), 
Thread.currentThread().getContextClassLoader()));
           } else {
               log.warn("plugin dir: {} not exists, load plugin from 
classpath", this.pluginDir);
               factories =
                       
FactoryUtil.discoverFactories(Thread.currentThread().getContextClassLoader());
           }
          ... 
   
   ```
   
   ### SeaTunnel Version
   
   2.3.3
   
   ### SeaTunnel Config
   
   ```conf
   Not applicable
   ```
   
   
   ### Running Command
   
   ```shell
   Not applicable
   ```
   
   
   ### Error Exception
   
   ```log
   Not applicable
   ```
   
   
   ### Zeta or Flink or Spark Version
   
   _No response_
   
   ### Java or Scala Version
   
   _No response_
   
   ### Screenshots
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [X] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [X] I agree to follow this project's [Code of 
Conduct](https://www.apache.org/foundation/policies/conduct)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to