Não é possível usar JFace e SWT no Eclipse sem criar plugin
Pergunta
ISENÇÃO DE RESPONSABILIDADE:
este é o caso clássico da GUI do .NET tentando contornar as coisas do JAVA.
DESCRIÇÃO DO PROBLEMA:
Estou tentando construir uma GUI muito simples com JFace e SWT - o código é direto (há muitos tutoriais), o que não é tão simples é que não consigo fazer o JFace e o SWT funcionarem fora de um projeto de plug-in.
Eu esperaria poder usar JFace e SWT em meu projeto sem problemas, já que coloquei "C:/Eclipse 3.5/plugins" em meu CLASSPATH (do meu computador -> propriedades -> avançado -> variáveis de ambiente) e todos os swt-*.dll que pude encontrar em meu PATH (usuário local e PATHs globais, com certeza) como Este artigo indica na caixa "Instalando SWT e JFace".
O problema é que não posso importar nada do eclipse.org, a menos que faça referência direta aos jars do buildpath -> bibliotecas -> adicionar jars externos (para que ele seja compilado, tenho que adicionar os seguintes jars: org.eclipse.swt.win32.win32.x86_3.5.1.v3555a.jar, org.eclipse.jface_3.5.1.M20090826-0800.jar).Depois de fazer isso, ele funciona bem, mas quando o executo como "Aplicativo Java", recebo o seguinte erro (devo CORRER COMO algo mais?):
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IProgressMonitor
at demo.ui.test.EntryPoint.main(EntryPoint.java:18)
Caused by: java.lang.ClassNotFoundException: org.eclipse.core.runtime.IProgressMonitor
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 1 more
Tentei depurar isso e basicamente ele é lançado assim que tenta instanciar o ApplicationWindow
classe (org.eclipse.jface.window.ApplicationWindow).Tentando reproduzir o erro, comentei todo o meu código e substituí-o pelo seguinte no meu main e gerou o mesmo erro acima na primeira linha:
ApplicationWindow w = new ApplicationWindow(null); //<-- error on this line
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();
QUESTÕES:
Questão 1:como posso corrigir o erro acima (gostaria de entender o que está acontecendo) e fazer a maldita coisa funcionar?
Questão 2:por que os potes não ficam visíveis no meu projeto e como fazê-los?
Provavelmente estou perdendo algo muito trivial devido à minha falta de familiaridade com Java e Eclipse.Qualquer ajuda muito apreciada!
EDITAR:parece que outra pessoa teve o mesmo problema -> http://www.eclipsezone.com/eclipse/forums/t60528.html - não está muito claro como eles resolveram o problema, agradecemos a ajuda
Solução
IProgressMonitor
interface não está disponível nos dois jars que você usa.Você também precisa colocar org.eclipse.equinox.common plugin no seu caminho de classe. IProgressMonitor
pode ser usado sem todo o ambiente Eclipse em execução.
(Esta é a solução do artigo ao qual você se refere.Originalmente, pensei que o IProgressMonitor estivesse no plug-in org.eclipse.core.runtime, mas foi movido para org.eclipse.equinox.common conforme descrito em erro #122935)
Outras dicas
Ecoando o argumento de Peter acima, sempre tenho que adicionar vários JARs para fazer as coisas funcionarem (especialmente para JFace).Normalmente, vou precisar
./org.eclipse.core.commands_3.3.0.I20070605-0010.jar
./org.eclipse.core.runtime_3.3.100.v20070530.jar
./org.eclipse.equinox.common_3.3.0.v20070426.jar
./org.eclipse.jface_3.3.1.M20070910-0800b.jar
./org.eclipse.osgi_3.3.2.R33x_v20080105.jar
./org.eclipse.ui.forms_3.3.0.v20070511.jar
Você pode usar algo como o jarfinder para ajudar a identificar quais arquivos residem em quais JARs.No Windows, lembro-me de usar o recurso localizar para procurar, digamos, IProgressMonitor.class
em arquivos zip/jar na pasta Eclipse no sistema de arquivos - já que às vezes os JARs reais podem ser difíceis de rastrear.
Normalmente trabalho vendo o que falha, rastreando/adicionando o JAR, enxágue e repita.
Fazer RCP/plugins parece que o Eclipse cuida de muitos dos problemas para você, fazer seu próprio aplicativo independente vem com essa bagagem extra, mas é muito bom ter uma GUI autônoma de aparência nativa adequada, se você continuar com ela.Portanto, normalmente configuro projetos Eclipse vanilla (sem plug-in) e isso força você a enfrentar esses problemas (adicionar JARs ao caminho de classe manualmente).Também é útil quando você deseja distribuir seu projeto.