Bitaholic

Compiling source directly from a program 본문

Computer/프로그래밍일반

Compiling source directly from a program

Bitaholic ...Simple is beautiful Bitaholic 2006. 8. 26. 03:30

영어 공부도 할겸 프로그래밍 공부도 할겸 짦은 테크팁 문서를 해석 해볼련다 ㅋㅋ 연습삼아..

 

오늘 할건 자바 application에서 java소스를 바로 컴파일 하는법에 대해서~ㅋㅋ

 

 

 

 'javac' 명령어를 쓸 필요없이 자바 어플리케이션에서 바로 코드를 컴파일 하는 것을 상상해보라.

이것은 JTextArea에 코드를 쓰고, 간단하게 버튼 하나 누름으로서 컴파일하는 것을 가능하게 해준다. 사실 당신은 이런 능력이 있다. 'tools.jar를 클래스패스에 추가하고, 자바 어플리케이션에서 바로 컴파일 할수 있다.

 

명령어줄에 근거한 javac 컴파일러(The Command line-basedjavaccomplier)는 com.sun.tools.javac.Main이라는 클래스에 간단하게 쌓여있다. 그 클래스의 static 메소드인 compile()를 이용해라 (하나 이상의 컴파일할 파일이름을 인자로 줄수 있다) 그럼 컴파일을 위해 커맨드라인(command line)을 이용할 필요가 없다.

 

데모를 위해 이 팁은 text field, text area, button으로 표시한 프로그램으로 보여준다. 프로그램의 이름을 text field에 입력하라(이 이름은 컴파일하길 원하는 클래스), 그리고 소스코드는 text area에 넣고, 버튼을 눌러라. 소스코드는 컴파일 되고 컴파일이 성공적으로 되면 프로그램은 작동이 될것이다. 여기서 데모한 api가 제공되지 않고 Sun에서 출시한 인스톨버젼군에서만 되는 것인지 아닌지 유의하라.예로 apple의 것은 다르게 구성되어 있다. J2SE의 1.5 릴리즈로 가능한 api로 계획되었다.

 

여기 예제 프로그램이 있다 실행해보라

[원문]

Imagine being able to compile code directly from a Java application without the need to issue ajavaccommand. This would allow you to do things like enter code into aJTextAreaand have it compiled simply by pressing a button. In fact, you have this capability. By putting thetools.jarfile in your classpath, you can compile directly from a Java application.

 

The command line-basedjavaccompiler is simply a wrapper to thecom.sun.tools.javac.Mainclass. Using the class's staticcompilemethod, you can pass (in aString[]) the name of one or more files to compile, and you don't need to use the command line for the compilation.

 

To demonstrate, this tip presents a program that displays a text field, a text area, and a button. You enter the name of a program (that is, the one you want to compile) in the text field, the program's source code in the text area, and then click the button. The source code is compiled and if the compile is successful, the program runs. Note however that the API demonstrated here is unsupported and dependent on an installation similar to the one shipped by Sun. Apple's, for example, is organized differently. With the 1.5 (Tiger) release of J2SE, the introduction of a portable API is planned.

 

Here is the demonstration program,RunIt:

 

 

   import java.awt.*;
   import java.awt.event.*;
   import javax.swing.*;
   import java.io.*;
   import java.lang.reflect.*;

   public class RunIt extends JFrame {
     JPanel contentPane;
     JScrollPane jScrollPane1 = new JScrollPane();
     JTextArea source = new JTextArea();
     JPanel jPanel1 = new JPanel();
     JLabel classNameLabel = new JLabel("Class Name");
     GridLayout gridLayout1 = new GridLayout(2,1);
     JTextField className = new JTextField();
        JButton compile = new JButton("Go");
  Font boldFont = new java.awt.Font("SansSerif", 1, 11);

     public RunIt() {
       super("Editor");
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       contentPane = (JPanel) this.getContentPane();
       this.setSize(400, 300);
       classNameLabel.setFont(boldFont);
       jPanel1.setLayout(gridLayout1);
       compile.setFont(boldFont);
       compile.setForeground(Color.black);
       compile.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
           try {
             doCompile();
           } catch (Exception ex) {
             System.err.println(
                   "Error during save/compile: " + ex);
             ex.printStackTrace();
           }
         }
       }); 
       contentPane.add(jScrollPane1, BorderLayout.CENTER);
       contentPane.add(jPanel1, BorderLayout.NORTH);
       jPanel1.add(classNameLabel);
       jPanel1.add(className);
       jScrollPane1.getViewport().add(source);
       contentPane.add(compile, BorderLayout.SOUTH);
     }
     public static void main(String[] args) {
       Frame frame = new RunIt();
       // Center screen
       Dimension screenSize =
         Toolkit.getDefaultToolkit().getScreenSize();
       Dimension frameSize = frame.getSize();
       if (frameSize.height > screenSize.height) {
         frameSize.height = screenSize.height;
       }
       if (frameSize.width > screenSize.width) {
         frameSize.width = screenSize.width;
       }
       frame.setLocation(
         (screenSize.width - frameSize.width) / 2,
         (screenSize.height - frameSize.height) / 2);
       frame.show();
     }
     private void doCompile() throws Exception {
       // write source to file
       String sourceFile = className.getText() + ".java";
       FileWriter fw = new FileWriter(sourceFile);
       fw.write(source.getText());
       fw.close();
       // compile it
       int compileReturnCode =
         com.sun.tools.javac.Main.compile(
             new String[] {sourceFile});
       if (compileReturnCode == 0) {
         // run it
        
         Object objectParameters[] = {new String[]{}};
         Class classParameters[] =
                     {objectParameters[0].getClass()};
         Class aClass =
                   Class.forName(className.getText());
         Object instance = aClass.newInstance();
         Method theMethod = aClass.getDeclaredMethod(
                              "main", classParameters);
         theMethod.invoke(instance, objectParameters);
       }
     }
   }

 

 

출처 :http://java.sun.com/developer/JDCTechTips/2003/tt0722.html

 

2 Comments
댓글쓰기 폼