

javax.toolsを用いてコンパイルしたいjavaファイルがあるのですが、別の自作のjavaファイルをimportしているため
シンボルを見つけられません と出てしまいます。  
(aaa.javaはbbb.javaをextendsしたいがaaa.javaをコンパイルする際エラーを吐く)  
importしたいファイルが膨大なためコンパイルしたいファイルにそれらを直接書き込むこともできません。何か方法はありますでしょうか？

プログラミング経験が少なくお恥ずかしい限りですがご容赦ください。

失礼しました。  
こちらがコンパイルするためのコードになります。

[code]

    public class DoCompile {
        public DoCompile() {
            File f = new File("D:/Desktop/compiletest/aaa.java");
            File d = new File("D:/Desktop/compiletest/classes");
    
            String[] args = {
                "-d", d.getAbsolutePath(),
                f.getAbsolutePath()
            };
    
            JavaCompiler c = ToolProvider.getSystemJavaCompiler();
            int r = c.run(null, null, null, args);
            System.out.println("return" + r);
            if(r == 0)
                System.out.println("BUILD SUCCESSFUL");
        }
    }
    
[/code]

aaa.javaはまったく別のjavaファイル、bbb.javaを継承しているファイルです

開発環境(IDE):Eclipse 使用言語 Java7


CC BY-SA 3.0
2016-02-23T22:50:14.533
22453
2016-04-24T18:43:41.860
2016-02-24T06:09:05.323
14521
14521
question
java
JavaのCompiler Toolsでコンパイルするjavaファイルに独自のjavaファイルを継承させたいがシンボルを見つけられませんと言われる


必要なクラスがインポートできてないからシンボルが見つからないんじゃないでしょうか

[code]

    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    import java.io.File;
    
[/code]

これ追加すれば、コンパイルは通ると思います


CC BY-SA 3.0
2016-02-24T05:02:08.917
22466
2016-02-24T05:02:08.917
14528
22453
answer


以下の2点が必要です。

  1. あるディレクトリ (例えば `./src`) の下に aaa.java や bbb.java 他、必要なファイルを置く
  2. `-sourcepath` オプションで前述のディレクトリを指定する

`-sourcepath`
は、コンパイルするのに足りないクラスファイルのソース(今回の場合はbbb.java)を探す場所を指定するオプションです。このオプションの存在は [javac
のドキュメント](http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html)
やヘルプに記載されています。

これを利用することで、コンパイルを実行する側のコードは以下のような感じになるでしょう。なお、質問中に書かれたコードから一部簡略化している箇所がありますが、適宜読み替えてください。

[code]

    public class DoCompile {
        public static void main(String[] unused) {
            String[] args = {
                "-d", "./classes",
                "-sourcepath", "./src",
                "./src/aaa.java"
            };
            JavaCompiler c = ToolProvider.getSystemJavaCompiler();
            int r = c.run(null, null, null, args);
            if (r != 0) {
                System.out.printf("build failed: %d\n", r);
            }
        }
    }
    
[/code]

実際に試せるサンプルコードを <https://github.com/koron/ja-stackoverflow-22453>
においておきました。コンパイルするファイル名が多少変わっていますが、基本的な構造は同じだと考えています。ご参考までに。


CC BY-SA 3.0
2016-02-24T16:41:29.313
22492
2016-02-24T16:47:20.743
2016-02-24T16:47:20.743
208
208
22453
answer