java jar导出器工具的问题

egmofgnx  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(92)

我正在尝试编写一个Java项目,它将编译任何Java项目并导出一个 *. jar文件。程序需要3个运行时参数,我将其指定为:

C:\dev\Kronos\Kronos
vendor
src\com\starworks\kronos

下面是我的代码:

public class GenJar {
    
    private static String PROJECT_DIR;
    private static String DEPENDENCIES_DIR;
    private static String SRC_DIR;

    private static final List<String> s_classpath = new ArrayList<String>();
    private static final List<String> s_sourceFiles = new ArrayList<String>();

    public static void main(String[] args) {
        PROJECT_DIR = args[0];
        DEPENDENCIES_DIR = PROJECT_DIR + File.separator + args[1];
        SRC_DIR = PROJECT_DIR + File.separator + args[2];

        File dependenciesDir = new File(DEPENDENCIES_DIR);
        for (File file : dependenciesDir.listFiles()) {
            if (!file.getName().endsWith(".jar") || (file.getName().contains("sources") || file.getName().contains("javadoc"))) {
                continue;
            }
            s_classpath.add(file.getPath());
            System.out.println("Added dependency: " + file.getPath());
        }
        
        File srcDir = new File(SRC_DIR);
        for (File file : srcDir.listFiles()) {
            addSourceFiles(file);
        }

        int success = compile();
        if (success != 0) {
            System.err.println("Compilation failed!");
            System.exit(1);
        }
        System.out.println("Compilation successful!");
        
        Manifest manifest = new Manifest();
        manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
        manifest.getMainAttributes().put(Attributes.Name.CLASS_PATH, String.join(";", s_classpath));
        
        exportJar();
    }

    private static int compile() {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        return compiler.run(null, null, null, "-d", PROJECT_DIR + File.separator + "bin", "-cp", String.join(File.pathSeparator, s_classpath), String.join(" ", s_sourceFiles));
    }
    
    private static void exportJar() {
    }

    private static void addSourceFiles(File file) {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File f : files) {
                    addSourceFiles(f);
                }
            }
        } else {
            s_sourceFiles.add(file.getPath());
            System.out.println("Added source file: " + file.getPath());
        }
    }
}

运行程序时,出现以下错误:
(% fn [x] %代表文件名,因为它们相当长;文件名,例如C:\设备\克罗诺斯\克罗诺斯\src\com\starworks\克罗诺斯\配置. java)

error: Invalid filename: %fn[0]% %fn[1]% %fn[2]% .. %fn[N]%
Usage: javac <options> <source files>
use --help for a list of possible options
Compilation failed!

我相信这个问题可以归结为不知道如何正确地针对多个源文件进行编译,但我不确定问题到底是什么。
我编写了一个应用程序,它指向一个Java项目的目录,然后导出为一个 *. jar文件。我希望代码编译一个Java项目的源目录,但文件没有以正确的方式指向。

t40tm48m

t40tm48m1#

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html#CBHHCGFB 向我建议你想;在编译器的-cp选项中分隔文件。看起来你使用了空格,你可能想尝试使用分号

相关问题