1

を見つけることができない私は、JavaコードコンパイラJavaコンパイラのAPI - 外部クラスファイル

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.tools.*; 
import java.io.*; 
import java.util.*; 

public class Compiler extends JFrame 
{ 
    String loc="D:\\java"; 
    File file=null, 
     dir=null; 
    boolean success; 
    public Compiler() 
    { 
     super("Highlight example"); 
     try 
     { 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     } 
     catch (Exception evt) {} 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1,2)); 

     JTextPane textPane = new JTextPane(); 
     JTextArea debug=new JTextArea(); 
     JButton comp=new JButton("Compile"), 
       browse=new JButton("..."); 

     JTextArea location=new JTextArea(); 

     JPanel right=new JPanel(), 
       up=new JPanel(); 

     up.setLayout(new BorderLayout()); 
     up.add(new JScrollPane(location),"Center"); 
     up.add(browse,"East"); 

     right.setLayout(new BorderLayout(2,1)); 
     right.add(up,BorderLayout.NORTH); 
     right.add(new JScrollPane(textPane), "Center"); 
     right.add(comp,"South"); 
     add(right); 
     add(new JScrollPane(debug)); 
     setSize(800, 400); 
     setVisible(true); 

     browse.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       success=false; 
       UIManager.put("FileChooser.readOnly", Boolean.TRUE); 
       JFileChooser fc = new JFileChooser(loc); 
       int status = fc.showOpenDialog(new JFrame()); 
       if (status==JFileChooser.APPROVE_OPTION) 
       { 
        debug.setText(""); 
        file = fc.getSelectedFile(); 
        dir = fc.getCurrentDirectory(); 
        try 
        { 
         textPane.read(new FileReader(file), null); 
        } 
        catch(Exception ex) 
        { 

        } 
       } 
      } 
     }); 

     comp.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       try 
        { 
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
         DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
         StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); 
         Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList(file+"")); 
         String[] option=new String[]{"-g","-parameters"}; 
         Iterable<String> options = Arrays.asList(option); 
         JavaCompiler.CompilationTask task=null; 

         fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir)); 

         task = compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits); 
         success = task.call(); 

         fileManager.close(); 
       //  System.out.println("Success: " + success); 
         if(success==true) 
         { 
          debug.setText("Success"); 
         } 
         else 
         { 
          int i=1; 
          for (Diagnostic diagnostic : diagnostics.getDiagnostics()) 
           if(diagnostic.getLineNumber()!=-1) 
            debug.append("Error on line "+diagnostic.getLineNumber()+" in "+ diagnostic+"\n"); 
         } 
        } 
        catch(Exception ex) 
        { 

        } 
      } 
     }); 
    } 

    public static void main(String[]args) 
    { 
     new Compiler(); 
    } 
} 

を作るための簡単なコードを持っているコンパイラは、前のコードの前の結果を見つけることができない理由を私は知りません。そして私はそれをどのように修正するのか分かりません。詳細については

は、私は例を作った:

  1. はA.java result A

  2. のA.java select A.java

  3. コンテンツを選択し、その後、私はB.javaを選択しています。 A.javaはそれがclass A enter image description here

もを見つけることができないので、B.javaをコンパイルすることはできません作成A.class enter image description here

  • でコンパイルされている見て、パッケージフォルダ内のクラスを見つけることができません。ここで

    は、例2:フォルダを作成<path>\a\b輸入

    enter image description here

    を使用して

    enter image description here

    とアクセスクラスで

    enter image description here

    A.javaコンパイルされています

    私はいくつかから

    を試してみる:に

    fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir)); 
    

    fileManager.setLocation(javax.tools.StandardLocation.CLASS_PATH, Arrays.asList(dir)); 
    

    が、それはjavax.tools.StandardLocation.CLASS_OUTPUTの設定に加えて

  • +0

    これらのファイルがどこにあるのかはあなたの写真からは分かりません。彼らは*両方とも*この 'example'フォルダに住んでいますか、あるいは彼らはあるフォルダ構造' a/b'に住んでいますか? – Makoto

    +0

    'example'フォルダ内の@Makoto javaファイル、パッケージが含まれている場合は構造体' a/b'フォルダ内のクラスファイルです。 – newbie

    答えて

    1

    を働いていない、あなたが含まれるようにjavax.tools.StandardLocation.CLASS_PATHを設定する必要があります以前の出力と同じ場所:

    fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir)); 
    // Set dirClassPath to include dir, and optionally other locations 
    fileManager.setLocation(javax.tools.StandardLocation.CLASS_PATH, Arrays.asList(dirClassPath)); 
    
    +0

    パッケージを使用するA.javaとインポートを使用するBが更新された場合は動作しないと思います。 – newbie

    +0

    @newbie正しくインポートしていません。それは 'import a.b。*; 'でなければなりません。 – dasblinkenlight

    +0

    ああ、残念です、投稿は更新されました – newbie

    1
    あなたがソースパスのディレクトリを指定する必要が

    、 あなたのコード

    String[] option=new String[]{"-g","-parameters"};

    locBクラスのルートディレクトリである。この

    String[] option=new String[]{"-g","-sourcepath", loc};

    を試してみてください。 Aは、独自のパッケージ内に適切に格納されています。

    私は私の修正 http://kurungkurawal.com/gifs/tut-compile.gif

    0

    は、外部クラスのJARファイルを作成し、コンパイラで添付して、あなたのコードを試してみました。

    List<String> optionList = new ArrayList<String>(); 
         // set compiler's classpath to be same as the runtime's 
    optionList.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path") 
           + getValueFromPropertieFile("jarfile1;jarfile2"))); 
    
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, 
           compilationUnit); 
    
    関連する問題