如何解决在另一个 Swing 应用程序中将 Swing 应用程序作为 jar 文件运行时出现 ClassNotFound 异常
我正致力于集成两个开发的 Swing 应用程序(主机和来宾)。来宾应用程序作为 jar 文件包含在宿主项目中。为了它们之间的通信,我在来宾内部创建了一个接口,并在主机内部实现了它。
// inside host
GUEST guest= GUEST.getInstance( );
Socket2host socket = new Socket2host() {
.
.
.
};
guest.setSocket(socket);
一切正常。但是,发布后,我注意到来宾无法从自己的源加载类。实际上,来宾应用程序尝试使用 xml 文件中的序列化程序重新加载项目(开发人员为此使用了 simpleframework 库)。在这里您可以查看代码内部:
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
}
}
当我在 Eclipse 中运行项目时,它运行良好,我可以在当前线程中看到所需的类。但是当我运行发布版本时,控制台上会记录以下错误。
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)
这里是xml文件的片段:(ipad.experimentSettings.IPADExperimental1DSVSSettings是所需的类)
<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>
我已经将访客应用程序(作为 JAR 文件)添加到类路径中,所以这个 post 对我没有帮助。我将类路径定义为我在 eclipse 上所拥有的,但它不起作用。我检查了“当前线程”,但应用程序找不到所需的类。 在这里,您可以找到加载访客类的最小可重现示例。
// 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() {
}
}
附加信息:以下代码运行已发布的版本。
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
我想知道为什么guest的类出现在Eclipse中,但在发布的版本中无法加载。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。