从 linux 命令行编译 java 项目

Compiling a java project from linux command line

我无法理解如何实际使用命令行来 运行 一个大的 java 项目(大的意思是有多个文件和文件夹)。

假设我有一个项目包含:

~/src/main/fr/file1.java
~/src/main/fr/file2.java

~/src/test/test1.java

我一生都在为我制作 makefile。我只是用 vim 编码 java src,然后用 make 编译和 运行。现在没有生成文件!我用 maven 编译(我仍然理解它是如何工作的。)。用maven编译后(我只是运行 maven编译)。然后我有一个名为 target 的新文件夹。

~/target/main/fr/file1.class
~/target/main/fr/file2.class


~/target/test/test1.class

现在我怎么 运行 test1 ?我尝试使用 java -classpath =... test1 但我总是出错 ...

如果有人能帮助我(或者给我一些资源,这样我就能最终理解基本的项目结构和脚本),那就太棒了。谢谢!

这是一个从多个位置编译 java 源文件并将它们打包到单个 运行nable jar 中的最小工作示例。

$ tree
.
├── makefile
├── src_folder_1
│   └── Main.java
└── src_folder_2
    └── Person.java

为了完整起见,java 个文件的内容出现在最后。这是生成文件。

BIN_DIR = bin
WITH_DEBUG_INFO = -g

.DEFAULT_GOAL:
app.jar:

compile_phase.done: ${SRC_FILES}
    @mkdir -p ${BIN_DIR}
    @javac ${WITH_DEBUG_INFO} ${SRC_FILES} -d ${BIN_DIR}
    @echo "DONE" >> $@

manifest.mf:
    @echo "Class-Path: ${BIN_DIR}/*.class\nMain-Class: Main\n" > $@

app.jar: manifest.mf compile_phase.done
    @jar cfm $@ $< -C ${BIN_DIR} .
    @rm -rf ${BIN_DIR}
    @rm $^

看到所有java源文件都是在same规则内编译的,对应的*.class文件放在专用的 bin 目录中。为了强调 运行 jar 所需的一切都在里面 我完全删除了 bin 目录和 manifest.mf。现在您可以 运行 程序

$ java -jar app.jar oren
Hello oren

为了完整性,这里有 java 个文件:

$ cat src_folder_1/Main.java 
class Main {
    static public void main(String[] args) {
        Person p = new Person(args[0]);
        System.out.format("Hello %s\n",p.toString()); }}
$ cat src_folder_2/Person.java 
class Person {
    private String name;
    public Person(String n) { this.name = n;}
    public String toString() { return name; }}