Java 中的 Makefile 创建
Makefile Creation in Java
我正在 Windows 环境中构建一个 java 程序,但我需要能够在 Linux 环境中编译它。我目前遇到 makefile 问题:
项目文件夹是这样组织的:
project_folder
library.jar
src
folder1
a.java
b.java
folder2
c.java
d.java
folder3
e.java
进入 folder3
的 e.java
文件几乎在所有其他 .java
文件中,因为它是主要结构,并且对于每个文件我都有行
import folder3.e;
当我使用来自另一个 class 文件的结构时,Eclipse 会自动生成。终端告诉我的内容:
error: Package folder3 does not exist
这是生成文件
JFLAGS = -g -cp library.jar -sourcepath .
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java \
src/folder3/e.java
default: classes
classes: $(CLASSES:.java=.class)
clean:
find . -name "*.class" -type f -delete
这是我为 java 创建的第一个 makefile,我想我错误地包含了 class 之间的引用,我该如何解决这个问题?
谢谢
更新:@Karthikeyan Vaithilingam 感谢您的详细回答,现在一切都清楚了!
将 -d .
添加到 JFLAGS
以便创建具有正确文件夹结构的 class 文件。
所以你的JFLAGS
应该如下所示。
JFLAGS = -g -cp .:library.jar -sourcepath . -d .
-d
是用于上例中目标文件夹的标志,它是当前文件夹。您可以使用任何目的地,但不要忘记使用 -cp
将其添加到 class 路径。通过使用-d
你可以保持源文件夹干净,清理也很容易,只需删除目标文件夹即可。
更新
问题是 CLASSES
部分中 Java 文件的顺序。由于 folder3.e
class 在其他 classes 中被引用,所以它必须在开头。应该是像下面这样的。
CLASSES = \
src/folder3/e.java \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java
您也可以将库保存在单独的文件夹中,然后使用 -cp libs\*
将所有 jar 添加到该文件夹中。将易于维护
因此文件夹结构将是
project_folder
libs
library.jar
src
folder1
a.java
b.java
folder2
c.java
d.java
folder3
e.java
最终的 Makefile 将是
JFLAGS = -g -cp ".:libs/*" -sourcepath . -d .
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
src/folder3/e.java \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java
default: classes
classes: $(CLASSES:.java=.class)
clean:
rm -r folder*
无关
我正在 Windows 环境中构建一个 java 程序,但我需要能够在 Linux 环境中编译它。我目前遇到 makefile 问题:
项目文件夹是这样组织的:
project_folder
library.jar
src
folder1
a.java
b.java
folder2
c.java
d.java
folder3
e.java
进入 folder3
的 e.java
文件几乎在所有其他 .java
文件中,因为它是主要结构,并且对于每个文件我都有行
import folder3.e;
当我使用来自另一个 class 文件的结构时,Eclipse 会自动生成。终端告诉我的内容:
error: Package folder3 does not exist
这是生成文件
JFLAGS = -g -cp library.jar -sourcepath .
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java \
src/folder3/e.java
default: classes
classes: $(CLASSES:.java=.class)
clean:
find . -name "*.class" -type f -delete
这是我为 java 创建的第一个 makefile,我想我错误地包含了 class 之间的引用,我该如何解决这个问题?
谢谢
更新:@Karthikeyan Vaithilingam 感谢您的详细回答,现在一切都清楚了!
将 -d .
添加到 JFLAGS
以便创建具有正确文件夹结构的 class 文件。
所以你的JFLAGS
应该如下所示。
JFLAGS = -g -cp .:library.jar -sourcepath . -d .
-d
是用于上例中目标文件夹的标志,它是当前文件夹。您可以使用任何目的地,但不要忘记使用 -cp
将其添加到 class 路径。通过使用-d
你可以保持源文件夹干净,清理也很容易,只需删除目标文件夹即可。
更新
问题是 CLASSES
部分中 Java 文件的顺序。由于 folder3.e
class 在其他 classes 中被引用,所以它必须在开头。应该是像下面这样的。
CLASSES = \
src/folder3/e.java \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java
您也可以将库保存在单独的文件夹中,然后使用 -cp libs\*
将所有 jar 添加到该文件夹中。将易于维护
因此文件夹结构将是
project_folder
libs
library.jar
src
folder1
a.java
b.java
folder2
c.java
d.java
folder3
e.java
最终的 Makefile 将是
JFLAGS = -g -cp ".:libs/*" -sourcepath . -d .
JC = javac
.SUFFIXES: .java .class
.java.class:
$(JC) $(JFLAGS) $*.java
CLASSES = \
src/folder3/e.java \
src/folder1/a.java \
src/folder1/b.java \
src/folder2/c.java \
src/folder2/d.java
default: classes
classes: $(CLASSES:.java=.class)
clean:
rm -r folder*
无关