(JavaCompiler)同时编译多个文件

(JavaCompiler)同时编译多个文件,java,javacompiler,Java,Javacompiler,因此,我正在构建一个程序,它使用内置的JavaCompilerAPI编译.java文件目录。我通过一个目录解析它来编译文件,甚至编译它们,只是没有按照我需要的顺序。我得到了经典的“找不到符号”,因为某些类彼此依赖。因此,一组用javac编译得很好的文件在我的程序中失败了 我需要一种方法,要么按照特定的顺序编译它们(我的最后一个选择实际上是通过文件解析以获取引用,但我不希望这样),要么同时编译 这是我的密码: import javax.tools.*; import java.io.*; impo

因此,我正在构建一个程序,它使用内置的JavaCompilerAPI编译.java文件目录。我通过一个目录解析它来编译文件,甚至编译它们,只是没有按照我需要的顺序。我得到了经典的“找不到符号”,因为某些类彼此依赖。因此,一组用javac编译得很好的文件在我的程序中失败了

我需要一种方法,要么按照特定的顺序编译它们(我的最后一个选择实际上是通过文件解析以获取引用,但我不希望这样),要么同时编译

这是我的密码:

import javax.tools.*;
import java.io.*;
import java.util.*;

public class SimpleCompileTest 
{
    public static void main(String[] args) 
    {

        try{
            File[] files;
            File dir = new File("Thing");
            files = dir.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".java");
                }
            });

        File file = new File("Errors.txt");
        try{
            FileOutputStream errorStream = new FileOutputStream("Errors.txt");

            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            for(int i = 0; i < files.length; i++)
            {
                int compilationResult = compiler.run(null, null, errorStream, files[i].getPath());
                        if(compilationResult == 0){
                            System.out.println("Compilation is successful");
                        }else{
                            System.out.println("Compilation Failed");
                        }
            }
        }catch(Exception e)
        {
            System.out.println("error in compiler");
        }
    }catch(Exception h)
    {
        System.out.println("error in filename");
    }
    }

}
import javax.tools.*;
导入java.io.*;
导入java.util.*;
公共类SimpleCompileTest
{
公共静态void main(字符串[]args)
{
试一试{
文件[]文件;
文件目录=新文件(“东西”);
files=dir.listFiles(新文件名过滤器(){
公共布尔接受(文件目录,字符串名称){
返回name.toLowerCase().endsWith(“.java”);
}
});
File File=新文件(“Errors.txt”);
试一试{
FileOutputStream errorStream=新的FileOutputStream(“Errors.txt”);
JavaCompiler=ToolProvider.getSystemJavaCompiler();
对于(int i=0;i
编辑:通配符(即*.java)在java编译器中不起作用


答:从注释中,我尝试代替文件[I].getPath()向编译器传递一个字符串[],其中包含所有文件的所有路径。很好!谢谢

从注释中,我尝试代替文件[I].getPath()向编译器传递一个字符串[],其中包含所有文件的所有路径。下面是解决方案

import javax.tools.*;
import java.io.*;
import java.util.*;

public class SimpleCompileTest 
{
    public static void main(String[] args) 
    {

        try{
            File[] files;
            File dir = new File("Thing");
            files = dir.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".java");
                }
            });
            String[] filenames = new String[files.length];
            for(int i = 0; i < files.length; i++)
                filenames[i] = files[i].getName();

        File file = new File("Errors.txt");
        try{
            FileOutputStream errorStream = new FileOutputStream("Errors.txt");

            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

                int compilationResult = compiler.run(null, null, errorStream, filenames);
                        if(compilationResult == 0){
                            System.out.println("Compilation is successful");
                        }else{
                            System.out.println("Compilation Failed");
                        }
        }catch(Exception e)
        {
            System.out.println("error in compiler");
        }
    }catch(Exception h)
    {
        System.out.println("error in filename");
    }
    }

}
import javax.tools.*;
导入java.io.*;
导入java.util.*;
公共类SimpleCompileTest
{
公共静态void main(字符串[]args)
{
试一试{
文件[]文件;
文件目录=新文件(“东西”);
files=dir.listFiles(新文件名过滤器(){
公共布尔接受(文件目录,字符串名称){
返回name.toLowerCase().endsWith(“.java”);
}
});
String[]filename=新字符串[files.length];
对于(int i=0;i
您是否尝试使用javac*.java?看起来您应该将所有文件传递给
编译器。一次运行
,而不是一次只运行一个?将包含所有文件的所有路径的
字符串[]
传递给它,而不是
文件[i].getPath()
。瓦瑟曼,你是个救生员,我不知道解决办法这么简单。我将文件[].getName放入一个字符串数组中,并将其发送进来,现在我正在完美地编译Java组。谢谢你,先生!如果您已经回答了您的问题,请鼓励您将其添加为答案。它增加了解决方案的可见性。我会这样做的!