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

进入 folder3e.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*

无关

你为什么不使用构建工具Gradle or Maven or Ant