Makefile with Jar和Package Dependencies

时间:2011-03-30 14:39:40

标签: java makefile dependencies packages javac

我一直在努力让这件事情发挥作用。基本上我需要创建一个makefile来从源代码构建我的项目。我对Linux知之甚少但并不多,我是一个完整的makefile新手。

我已经尝试了来自网络的大量示例,并且都抱怨他们缺少依赖项。其他人建议使用Ant或Mavern,但这不可能是精确的手部通知:

  

引自规范

     

您的提交应包含一个   单个文件comp2010.tar适合   在Linux系统上使用。这必须   包含一个文件Makefile,以及所有   源。你不应该交任何   .class文件。你的Makefile必须构建   来自Java源代码的工具。该   主要类必须叫Blaise。在   简而言之,(自动)测试过程   将包括:

     

tar xf comp2010.tar

     

make

     

java Blaise < test.file > testout 2> testerr

     

这些命令将在一个执行   标准中的空目录   部门教学Linux   Java 1.6环境。该   CLASSPATH将包含ANTLR jar,   版本3.2。

     

注意:请确保您的   提交可以编译和   在标准部门执行   机器。请确认你   使用正确版本的Java,和   你不使用绝对路径。如果   你使用任何外部库   也需要提交这些。

所以你看到我无法设置任何环境变量,因为运行它的机器不是我的,我不允许管理访问。我无法提交任何类文件,因此makefile不适合我,而Ant / Mavern脚本将无法工作,因为测试过程是自动化的并使用此makefile,我允许提交的所有文件都是.java文件。所以我需要构建一个makefile,没有办法解决这个问题。

源结构如下:

  

SRC \包1 *的.java

     

SRC \包2 *的.java

     

自动生成\程序包A *的.java

要编译的东西需要所有3个文件夹中的源文件。 Main()方法位于src \ Package1 \ 1.java

这些目录中的每一个都是Eclipse中的一个包,这三个包依赖于彼此以及外部Jar文件antlr-3.2.jar


那么如何制作这个makefile。这是我的问题,我在下面提供了自己的尝试:


JAVAC = javac
CLASS_FILES = src/package1/1.class auto-generated/packageA/2.class auto-generated/packageA/3.class auto-generated/packageA/4.class src/Package2/5.class src/Package2/6.class src/Package2/7.class src/Package2/8.class src/Package2/9.class src/Package2/10.class src/Package2/11.class src/Package2/12.class antlr-3.2.jar.*

Default: $(CLASS_FILES)

%.class: %.java
    $(JAVAC) $<

clean: $(RM) *.class

这失败了,例如“org.antlr.runtime不存在”,这是在antlr-3.2.jar中。我在我的智慧结束,很快就需要交出来。我假设我只是简单地导入了jar,也许我需要使用CLASSPATH。我很抱歉,如果这是一个简单的问题,但我现在已经尝试了6个小时制作其中一个。你能给予的任何帮助都会非常感激。

亲切的问候 Feldoh

3 个答案:

答案 0 :(得分:4)

我可以在这里看到一些问题:

  • 如上所述,您需要在tar文件
  • 的根目录中的默认包中设置Blaise类
  • 您使用的任何软件包也应直接存在于根目录下,而不是存在于源子目录中(因为Java / Javac将无法在其中找到它们)
  • make特定于您使用空格和制表符
  • 的地方
  • 你的makefile不使用javac命令的选项
  • 您尝试为哪个make版本构建makefile?我知道的版本采用如下格式:

    JAVAC = javac
    JAVACFLAGS =
    SRC= Blaise.java \
        package1/1.java \
        packageA/2.java
    CLS= $(SRC:.java=.class)
    
    all:  $(CLS)
    
    
    .SUFFIXES : .class .java
    .java.class :
        $(JAVAC) $(JAVACFLAGS) $<
    

答案 1 :(得分:3)

如果使用不包含当前目录的类路径,请确保指明源路径。

JAVAC = javac
CLASS_FILES = src/package1/1.class auto-generated/packageA/2.class auto-generated/packageA/3.class auto-generated/packageA/4.class src/Package2/5.class src/Package2/6.class src/Package2/7.class src/Package2/8.class src/Package2/9.class src/Package2/10.class src/Package2/11.class src/Package2/12.class

CLASSPATH = antlr-3.2.jar
SOURCEPATH = .

Default: $(CLASS_FILES)

%.class: %.java
    $(JAVAC) -classpath $(CLASSPATH) -sourcepath $(SOURCEPATH) $<

clean: $(RM) *.class

替代方法是使用包含当前目录的类路径(因为在没有提供源路径时使用类路径):

CLASSPATH = .:antlr-3.2.jar

%.class: %.java
    $(JAVAC) -classpath $(CLASSPATH) $<

(其余如上)

当然,您也可以将选项添加到JAVAC变量中。

答案 2 :(得分:0)

通过将antlr添加到类路径来修复您的javac调用。我真的很鄙视我的CS教授使用的自动标记脚本。他们根据提交负载随机失败。 Here是Java和Makefiles的一个很好的介绍。基本上尝试为.java和.class文件添加glob。使用JFLAGS在classpath中传递antlr。