【问题标题】:Makefile Creation in Java在 Java 中创建 Makefile
【发布时间】:2015-11-17 14:04:57
【问题描述】:

我正在 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;

当我使用来自另一个类文件的结构时,Wich 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 生成文件,我认为我错误地包括了类之间的引用,我该如何解决这个问题?

谢谢

更新:@Karthikeyan Vaithilingam 感谢您的详细回答,现在一切都清楚且有效!

【问题讨论】:

  • 构建系统如AntMavenGradle 是为Java 开发的,因为make 被认为不够强大。因此,如果您的项目要增长,您可能希望改用其中之一。

标签: java build terminal makefile


【解决方案1】:

-d . 添加到JFLAGS,这样类文件就会以正确的文件夹结构创建。

所以你的JFLAGS应该如下。

JFLAGS = -g -cp .:library.jar -sourcepath . -d .

-d 是上例中用于目标文件夹的标志,它是当前文件夹。您可以使用任何目的地,但不要忘记使用-cp 将其添加到类路径中。通过使用-d,您可以保持源文件夹的清洁,而且清理也很容易,只需删除目标文件夹即可。

更新

问题在于CLASSES 部分中Java 文件的顺序。由于folder3.e 类在其他类中被引用,它必须在开头。应该像下面这样。

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*

不相关

为什么不使用构建工具GradleMavenAnt

【讨论】:

  • 谢谢,但添加 -d 不起作用,我得到与以前相同的错误
  • 如果我使用这个:JFLAGS = -g -cp library.jar -sourcepath。 -d 。如果我完全使用您的刺痛,我会遇到与以前相同的错误: JFLAGS = -g -cp .;library.jar -sourcepath 。 -d 。我得到一个不同的错误,“javac:没有源文件”使用:...... /bin/sh:1:library.jar:未找到
  • 谢谢你,你真的帮了我很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多