Eclipse SWT - 导出的.jar无法导入方法

时间:2014-03-22 19:42:21

标签: java eclipse jar bukkit

我已将SWT文件“.jar”作为外部jar添加到我的项目中。所以它被导入到我的项目中,我可以通过以下方式调用它的方法:

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

当我这样做时没有导入错误,所以我怀疑一切都正常工作。但是,当我将其导出为“.jar”并使用它时,有错误说“org.eclipse.swt。[etc] ...”不存在。

我正在尝试制作一个使用GUI(SWT)的Bukkit插件,我不知道为什么这不起作用 - 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在eclipse中运行主课程后,请转到File > Export > Runnable JAR。选择与文件匹配的配置。 你应该得到:

enter image description here

如果您需要动态加载swt:

public static String getArchFilename(String prefix) 
{ 
   return prefix + "_" + getOSName() + "_" + getArchName() + ".jar"; 
} 

private static String getOSName() 
{ 
   String osNameProperty = System.getProperty("os.name"); 

   if (osNameProperty == null) 
   { 
       throw new RuntimeException("os.name property is not set"); 
   } 
   else 
   { 
       osNameProperty = osNameProperty.toLowerCase(); 
   } 

   if (osNameProperty.contains("win")) 
   { 
       return "win"; 
   } 
   else if (osNameProperty.contains("mac")) 
   { 
       return "osx"; 
   } 
   else if (osNameProperty.contains("linux") || osNameProperty.contains("nix")) 
   { 
       return "linux"; 
   } 
   else 
   { 
       throw new RuntimeException("Unknown OS name: " + osNameProperty); 
   } 
} 

private static String getArchName() 
{ 
   String osArch = System.getProperty("os.arch"); 

   if (osArch != null && osArch.contains("64")) 
   { 
       return "64"; 
   } 
   else 
   { 
       return "32"; 
   } 
}
public static void addJarToClasspath(File jarFile) 
{ 
   try 
   { 
       URL url = jarFile.toURI().toURL(); 
       URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
       Class<?> urlClass = URLClassLoader.class; 
       Method method = urlClass.getDeclaredMethod("addURL", new Class<?>[] { URL.class }); 
       method.setAccessible(true);         
       method.invoke(urlClassLoader, new Object[] { url });             
   } 
   catch (Throwable t) 
   { 
       t.printStackTrace(); 
   } 
}

然后:

File swtJar = new File(getArchFilename("lib/swt")); 
addJarToClasspath(swtJar);

假设jar外面的te结构是:

lib/swt_win_32.jar 
lib/swt_win_64.jar 
lib/swt_linux_32.jar 
lib/swt_linux_64.jar

来自http://www.chrisnewland.com/select-correct-swt-jar-for-your-os-and-jvm-at-runtime-191