zoukankan      html  css  js  c++  java
  • 用Makefile管理Java项目

     目录

    为什么用makefile

    make是我最喜欢的Unix工具之一,通过makefile,它可以做许多自动化的事 情。我用make管理我的Linux配置文件,管理我的笔记,当然,也用它管理 我的编程项目。

    最近需要写java程序,由于我想在Emacs而不是Eclipse里做开发,就需要一 个管理项目的工具。由于不会ant ,自然而然就又想到了make。看过一个外 国人比较make和ant管理java项目的文章,说对于小的java项目,make更占 优势。所依我决定写一个比较通用的makefile,用make来管理我的java项目。 于是就有了下面的makefile。

    我在java项目中通用的makefile

    # A general java project makefile
    # Author: Wu Jiqing (jiqingwu@gmail.com)
    # create: 2012-06-12
    # update: 2012-06-13
    # version: 0.7
    
    # 设置你要生成的jar包的文件名
    # Set the file name of your jar package:
    JAR_PKG = a.jar
    # 设置你的项目的入口点
    # Set your entry point of your java app:
    ENTRY_POINT = test.A
    # 是否需要res目录,如果你的程序有图片、文档等,
    # 最好放入res目录中。
    # yes: 需要;no:不需要
    RES_DIR = yes
    # 设置你项目包含的源文件
    # 如果你使用了package,请自己在src下建立相应的目录层次,
    # 并将源文件放在对应的目录中。
    # 如你要生成的一个类是 com.game.A,
    # 那么你的源文件应该是 com/game/A.java。
    # 多个类之间用空格间隔,如果一行太长,用'\'换行,
    # 建议一行一个。
    # 另外注意顺序,如果class A 引用 class B,那么B.java应该放在A.java前。
    SOURCE_FILES = \
    test/B.java \
    test/A.java
    
    # 设置你的java编译器
    # Set your java compiler here:
    JAVAC = javac
    # 设置你的编译选项
    JFLAGS = -encoding UTF-8
    
    # 用法:
    # make new: 在你的工程目录下生成src, bin, res子目录。
    # 如果你定义的类包含在某个包里:请自己在src下建立相应的目录层次。
    # 最终的目录结构如下:
    # ├── a.jar
    # ├── bin
    # │     └── test
    # │             ├── A.class
    # │             └── B.class
    # ├── makefile
    # ├── res
    # │     └── doc
    # │            └── readme.txt
    # └── src
    #        └── test
    #                ├── A.java
    #                └── B.java
    
    # make build: 编译,在bin目录下生成 java classes。
    # make clean: 清理编译结果,以便重新编译
    # make rebuild: 清理编译结果,重新编译。
    # make run: make 之后,可以通过make run查看运行结果。
    # make jar: 生成可执行的jar包。
    
    #############下面的内容建议不要修改####################
    
    vpath %.class bin
    vpath %.java src
    
    # show help message by default
    Default:
        @echo "make new: new project, create src, bin, res dirs."
        @echo "make build: build project."
        @echo "make clean: clear classes generated."
        @echo "make rebuild: rebuild project."
        @echo "make run: run your app."
        @echo "make jar: package your project into a executable jar."
    
    build: $(SOURCE_FILES:.java=.class)
    
    # pattern rule
    # 不能处理两个类互相引用的情况,尽量避免
    %.class: %.java
        $(JAVAC) -cp bin -d bin $(JFLAGS) $<
    
    rebuild: clean build
    
    .PHONY: new clean run jar
    
    new:
    ifeq ($(RES_DIR),yes)
        mkdir -pv src bin res
    else
        mkdir -pv src bin
    endif
    
    clean:
        rm -frv bin/*
    
    run:
        java -cp bin $(ENTRY_POINT)
    
    jar:
    ifeq ($(RES_DIR),yes)
        jar cvfe $(JAR_PKG) $(ENTRY_POINT)  -C bin . res
    else
        jar cvfe $(JAR_PKG) $(ENTRY_POINT) -C bin .
    endif

    可以在这里下载: java-makefile-0.7

    用法

    1. 将此makefile放入你的工程目录,确保文件名是 makefile 或 Makefile 。然后用你喜欢的编辑器打开它,设置变量:
      • JAR_PKG: 如果你最后要打包项目,设置你的jar包文件名。
      • ENTRY_POINT: 程序执行的入口类
      • RES_DIR: yes或no,如果创建工程时你需要创建res目录存放图片等资 源,设置为yes。
      • SOURCE_FILES: 这是最重要的,设置你要编译的源文件。如果你使用 了package,就在src目录中创建对应的目录层次,然后把源源文件放 入对应的目录。这里设置的源文件应该包括包的目录层次。如你的类 com.game.A,对应的源文件是 src/com/game/A.java,那么在这里的 源文件名是 com/game/A.java,即src下的相对路径。
      • JAVAC: java编译器,如果你使用sun java,那这里是javac。也可以 填写你的java编译器的绝对路径。
      • JFLAGS:填写你的编译选项,如果要调试加 -g ,如果文件中包 含中文字符,可能要设置编码,如果文件编码是 UTF-8 ,选项中 要添加 -encoding UTF-8 。更多选项,查看 javac-help 。
    2. make new: 新建工程,在当前目录下生成src, bin, res(如果 RES_DIR = yes)子目录,类似Eclipse项目的目录层次。java源文件放 在src目录下,生成的class放在bin目录下。
    3. make build: 编译工程。
    4. make clean: 清除生成的class,以便重新编译。
    5. make rebuild: 重新编译工程,相当于make clean; make build。
    6. make run: 运行编译生成的应用。
    7. make jar: 生成可执行的jar包。
    8. make: 显示帮助信息。

    TODO:

    目前主要的缺陷是不能支持两个类互相引用的情况,如果两个类互相引用, 需要两个源文件同时编译,而这是makfile中的模式规则难支持的。

    现在的比较肮脏的解决方案是:如果类A和类B互相引用,则把A.java 和B.java放在 SOURCE_FILES 列表的最前面。 并在模式规则后面附加 B.java,即:

    %.class: %.java B.java
        $(JAVAC) -cp bin -d bin $(JFLAGS) $<
    

    我对makefile的理解还不透彻,欢迎大家多提宝贵意见,一起来完善这个makefile。

    参考

    • 陈皓《跟我一起写makefile》。绝对推荐。
  • 相关阅读:
    Laravel 底层原理:门面(Facades)
    用 PHP和Golang 来刷leetCode 之 无重复字符 最长子串
    今天发现一个好用的查询IP地址的工具,记录一波
    Ubuntu下安装SDL
    敏捷宣言
    python 读取xml文档
    每个程序员都必须遵守的编程原则
    作为Web开发人员,我为什么喜欢Google Chrome浏览器
    爬虫
    Python为什么要self
  • 原文地址:https://www.cnblogs.com/jiqingwu/p/java_makefile.html
Copyright © 2011-2022 走看看