I am working on the integration of two developed swing applications (host and guest). The guest application is included as a jar file in the host project. For communication between them, I created an interface inside the guest and implemented it inside the host.
// inside host 
GUEST guest= GUEST.getInstance( );
Socket2host socket = new Socket2host() {
               .
               .
               . 
                };
guest.setSocket(socket);
Everything works well. However, after release, I noticed that the guest cannot load a class from its own source. Indeed, the guest application tries to reload a project using a Serializer from an xml file(the developer used simpleframework library for this). Here you can look inside the code:
Serializer serializer = new Persister();
setInstanceFromXML(serializer, *xml string);
    public static void setInstanceFromXML(Serializer s, String in){
        try {
            s.read(SingletonHolder.instance, in);
        } catch (Exception ex) {
            // Logging
        }
    }
When I run the project in Eclipse, it works well and I can see the desired class in the current thread. but when I run the release version, the following error is logged on the console.
java.lang.ClassNotFoundException: ipad.experimentSettings.IPADExperimental1DSVSSettings
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.simpleframework.xml.strategy.TreeStrategy.getClass(TreeStrategy.java:270)
        at org.simpleframework.xml.strategy.TreeStrategy.getValue(TreeStrategy.java:183)
        at org.simpleframework.xml.strategy.TreeStrategy.getElement(TreeStrategy.java:123)
        at org.simpleframework.xml.core.Source.getOverride(Source.java:330)
        at org.simpleframework.xml.core.Factory.getConversion(Factory.java:144)
        at org.simpleframework.xml.core.Factory.getOverride(Factory.java:100)
        at org.simpleframework.xml.core.ObjectFactory.getInstance(ObjectFactory.java:64)
        at org.simpleframework.xml.core.Composite.read(Composite.java:125)
        at org.simpleframework.xml.core.Composite.readObject(Composite.java:621)
        at org.simpleframework.xml.core.Composite.read(Composite.java:567)
        at org.simpleframework.xml.core.Composite.readElement(Composite.java:548)
        at org.simpleframework.xml.core.Composite.readElements(Composite.java:464)
        at org.simpleframework.xml.core.Composite.read(Composite.java:350)
        at org.simpleframework.xml.core.Composite.read(Composite.java:158)
        at org.simpleframework.xml.core.Traverser.read(Traverser.java:106)
        at org.simpleframework.xml.core.Persister.read(Persister.java:707)
        at org.simpleframework.xml.core.Persister.read(Persister.java:687)
        at org.simpleframework.xml.core.Persister.read(Persister.java:667)
        at org.simpleframework.xml.core.Persister.read(Persister.java:648)
        at org.simpleframework.xml.core.Persister.read(Persister.java:565)
        at ipad.IPADConditions.setInstanceFromXML(IPADConditions.java:89)
        at ipad.IPADApp.reloadFitProject(IPADApp.java:2974)
        at ipad.IPADApp.loadFitProject(IPADApp.java:2901)
        at ipad.ui.IPADMenuBar.actionPerformed(IPADMenuBar.java:257)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.AbstractButton.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
here is the snippet of xml file:(ipad.experimentSettings.IPADExperimental1DSVSSettings is desired class)
<experimentalParameterSettings class="ipad.experimentSettings.IPADExperimental1DSVSSettings">
      <numberOfResponses>1</numberOfResponses>
      <TEsDefined>true</TEsDefined>
      <TRsDefined>false</TRsDefined>
      <TSsDefined>false</TSsDefined>
      <TIsDefined>false</TIsDefined>
      <TMsDefined>false</TMsDefined>
      <TOthersDefined>false</TOthersDefined>
      <TEs length="1">
         <double>0.0</double>
      </TEs>
      <TRs length="1">
         <double>0.0</double>
      </TRs>
      <TSs length="1">
         <double>30.0</double>
      </TSs>
      <TIs length="1">
         <double>0.0</double>
      </TIs>
      <TMs length="1">
         <double>0.0</double>
      </TMs>
      <TOthers length="1">
         <double>0.0</double>
      </TOthers>
      <currentExperimentType>SVS_1D</currentExperimentType>
   </experimentalParameterSettings>
I already added the guest application(as a JAR file) to the classpath, So this post didn't help me. I defined the classpath as what I had on eclipse but it did not work. I checked the "current thread", but the app could not find the desired class. Here you can find a minimal reproducible example of loading the guest's class.
// host app
import java.awt.event.*;  
import javax.swing.*;    
public class ButtonExample {  
public static void main(String[] args) {  
    JFrame f=new JFrame("minimal reproducible example");  
    final JTextField tf=new JTextField();  
    tf.setBounds(50,50, 150,20);  
    JButton b=new JButton("Click Here");  
    b.addActionListener(new ActionListener(){  
        public void actionPerformed(ActionEvent e){  
            Guest guest = Guest.getInstance;  
        }  
    });  
    f.setLayout(null);  
    f.setVisible(true);   
}  
}  
// guest app
public class Guest extends JFrame implements ActionListener {
private static Guest theInstance = null;
public Guest (){
String in = <address to desired class in the package> 
try {   
 System.out.println(Thread.currentThread().getContextClassLoader().loadClass(in));
} catch (Exception ex) {
    System.out.println(ex);
}
}
public static Guest getInstance( )
{
    if ( theInstance == null )
    {
        theInstance = new Guest ( );
    }
    return theInstance;
}
// desired class for loading
public class DesiredClass{
    public DesiredClass() {
    }
}
Additional info: the below code runs the released version.
set javaFile="C:\Program Files (x86)\Java\jre1.8.0_202\bin\java"
cd /d %~dp0
set path=%path%;%CD%\lib
%javaFile% -Xss2m -Xmx900m -Djava.library.path=lib -jar lib/mrui.jar %*
pause
I was wondering why the classes of the guest appear in Eclipse but it cannot be loaded in the released version.
