使用 Java 的 Makefile

问题描述 投票:0回答:1

为了上大学,我必须使用Java。但是,我不想使用 IDE。我喜欢 vim。

所以我尝试创建一个 Makefile 来构建我的 java 项目。我的要求是:

  1. 没有类的硬编码。 Makefile 将查找

    .java
    目录和任何子目录中的所有
    src
    文件,并将生成的类编译到
    classes
    目录。

  2. 多个

    mains
    :包含
    main
    函数的文件应具有使用相应
    .jar
    构建的可执行
    MANIFEST.MF
    文件。明确列出它们是可以接受的,尽管我很确定可以使用
    grep
    在这里自动找到它们(但我很糟糕
    grep

  3. 应创建整个项目的源jar,其中包含未更改的

    .java
    文件,并且没有
    MANIFEST.MF
    或其他无关文件。

迄今为止我最好的尝试(目前已失败)如下:

include gmsl

targets := Client Server

# Folders 

binDir  := ./bin
clsDir  := ./classes
srcDir  := ./src
testDir := ./test

# Flags

version := 11

# Files

mainSrc := $(targets:%=$(srcDir)/tp1/%.java)
src  := $(shell find $(srcDir) -name *\.java -type f)
cls  := $(src:%.java=%.class)

# Rules

# Base
all     : $(targets)
again   : clean all
classes : $(cls)

# For debug
info:
    $(info mainSrc : $(mainSrc))
    $(info srcJar  : $(srcJar))
    $(info exeJar  : $(exeJar))
    $(info src     : $(src))
    $(info cls     : $(cls))

# Executables
$(targets): $(cls)
    $(shell cd $(srcDir))
    $(eval mainCls := $(shell find . -name *$@\.java -type f) )
    $(info mainCls = $(mainCls))
    jar --verbose --create --file=$(call lc,$@)-exe.jar --main-class=tp1/$@ -C $(clsDir) .

# Source
$(srcJar) : $(cls)
    jar --verbose --create --file=$@ --no-manifest -C $(srcDir) .

# Classes
$(cls):
    javac --release $(version) --source-path $(srcDir) -d $(clsDir) $(mainSrc)

# Cleanup
clean:
    -rm $(targets)
    -cd $(clsDir) && rm -rf ./*

java makefile gnu-make build-system
1个回答
0
投票

简短回答:选择非 IDE 解决方案是可以的。然而,将自己限制为“make”作为唯一的构建工具,对于任何重要的项目来说,很可能会导致以下两个结果之一:

  1. 低效的构建,其中每个构建将(重新)编译/(重新)打包远远超过所需的内容(Make的优势之一是基于时间戳的增量构建),或者
  2. 不可靠的构建,有时不会重建所需的目标,因为它将无法理解依赖关系。

还有什么替代方案吗?使用“理解”Java 的工具,并且具有适当的内置操作来构建 Java 工件:

  • Maven:如果您想要现代解决方案,或者
  • Ant:如果你想要简单的“手动齿轮”解决方案。

从技术上讲,您可以构建一个 Makefile 来为您执行 ant/build。

compile:
    mvn build

clean:
    mvn clean

...
© www.soinside.com 2019 - 2024. All rights reserved.