从 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; }}
我无法理解如何实际使用命令行来 运行 一个大的 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; }}