Boa tarde a todos,
Estou estudando os códigos referentes ao artigo sobre compilação dinâmica no Java da revista Java Magazine 94. Os códigos, dando um jeitinho aqui outro ali, funcionaram. E realmente compila e executa códigos que possuam somente saída no terminal ( o famoso System.out.println), porém quando tento compilar um código mais complexo, como um que contenha um JFrame, o mesmo gera o seguinte erro:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no freetype in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at sun.font.FontManagerNativeLibrary$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerNativeLibrary.<clinit>(Unknown Source)
at sun.font.SunFontManager$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<clinit>(Unknown Source)
at sun.awt.PlatformFont.<init>(Unknown Source)
at sun.awt.windows.WFontPeer.<init>(Unknown Source)
at sun.awt.windows.WToolkit.getFontPeer(Unknown Source)
at java.awt.Font.getPeer_NoClientCode(Unknown Source)
at java.awt.Font.getPeer(Unknown Source)
at sun.awt.windows.WComponentPeer._setFont(Native Method)
at sun.awt.windows.WComponentPeer.setFont(Unknown Source)
at sun.awt.windows.WWindowPeer.initialize(Unknown Source)
at sun.awt.windows.WFramePeer.initialize(Unknown Source)
at sun.awt.windows.WComponentPeer.<init>(Unknown Source)
at sun.awt.windows.WCanvasPeer.<init>(Unknown Source)
at sun.awt.windows.WPanelPeer.<init>(Unknown Source)
at sun.awt.windows.WWindowPeer.<init>(Unknown Source)
at sun.awt.windows.WFramePeer.<init>(Unknown Source)
at sun.awt.windows.WToolkit.createFrame(Unknown Source)
at java.awt.Frame.addNotify(Unknown Source)
at java.awt.Window.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at TesteFrm.montaTela(TesteFrm.java:21)
at TesteFrm.<init>(TesteFrm.java:11)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at compilador.Teste.main(Teste.java:52)
Olhando o erro, a princípio, achei que era algum problema no classpath ou alguma lib faltando, porém o código não faz referência a nenhum elemento que esteja fora do padrão do Java.
Este é o código que estou executando:
package compilador;
public class Teste {
public static void main(String[] args) throws Exception {
JavaCodeCompiler<Runnable> compiler = new JavaCodeCompiler<Runnable>();
//Código sem erro
// String source = "public class RunableImpl implements Runnable{" +
// "public void run(){" +
// "System.out.println(\"Foi!!!\");" +
// "}" +
// "}";
//Código que gera o erro
String source = "import java.awt.FlowLayout;\n"+
"\n"+
"import java.awt.Dimension;\n"+
"import javax.swing.JFrame;\n"+
"import javax.swing.JLabel;\n"+
"\n"+
"public class TesteFrm implements Runnable{\n"+
"\n"+
" \n"+
" public TesteFrm(){\n"+
" montaTela();\n"+
" }\n"+
" \n"+
" private void montaTela(){\n" +
" JFrame jf = new JFrame();"+
" jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n"+
" JLabel l = new JLabel(\"Teste\");\n"+
" \n"+
" jf.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));\n"+
" jf.getContentPane().add(l);\n"+
" \n"+
" jf.setVisible(true);\n"+
" jf.pack();\n"+
" }\n"+
"\n"+
" \n"+
" public void run() {\n"+
" montaTela();\n"+
" \n"+
" }\n"+
"}\n";
;
// A chamada deste método é assim compiler.compile(nome_pacote, nome_classe, código);
// Chamada sem erro
// Class<Runnable> clazz = compiler.compile(null, "RunableImpl", source);
// Chamada que gera o erro
Class<Runnable> clazz = compiler.compile(null, "TesteFrm", source);
// Onde o erro ocorre
Runnable r = clazz.newInstance();
r.run();
}
}
Agradeço a todos que puderem dar alguma ajuda.
Inté…