带有Jar和Package依赖的Makefile

4
我一整天都在尝试让这个东西工作。基本上,我需要创建一个makefile来从源代码构建我的项目。我对Linux有一点了解,但不多,而且我是完全的makefile新手。
我尝试了来自互联网各地的大量示例,所有这些示例都抱怨缺少依赖项。其他人建议使用Ant或Mavern,但这不可能,因为精确的提交通知如下:
引用自规范
您的提交应包括一个适用于Linux系统的单个文件comp2010.tar。这必须包含一个名为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\Package1*.java src\Package2*.java auto-generated\PackageA*.java
所有3个文件夹中都有源文件需要进行编译。Main()方法在src\Package1\1.java中。
每个目录都是Eclipse中的一个包,并且这3个包彼此依赖,以及外部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 does not exist",这是在antlr-3.2.jar中的。我已经尝试了很多方法但都失败了,需要尽快解决。我猜测我导入jar包的方式不正确,可能需要使用CLASSPATH。如果这是一个简单的问题,那么请原谅我的无知,因为我已经连续努力了6个小时来解决这个问题。如果你能提供任何帮助,我将不胜感激。

此致 Feldoh


它明确指出您缺少antlr jar依赖项。因此,您必须将其添加到类路径中。命令类似于javac -cp(或-classpath)directory/antlr.jar。 - Dimitri
另一个可能的问题是,有很多类文件,但这些只是.java文件,因为自动生成的东西中有很多内部类。 - feldoh
你忘记了“没有绝对路径”的口头禅。 - whatnick
将jar文件放在与makefile相同的目录中,然后将"javac -cp /home/Feldoh/src/antlr-3.2.jar"替换为"javac -cp antlr-3.2.jar",这样可以消除很多错误,从28个减少到6个。 - feldoh
你能否在命令行中编译/运行而不出错(即不使用makefile)? - Beta
显示剩余2条评论
3个回答

4

我在这里看到了一些问题:

  • as described you need to setup the Blaise class in the default package in the root directory of the tar file
  • any packages you use, should also be present directly under the root directory, not in a source sub-directory (as Java/Javac will not be able to find them there)
  • make is specific wrt where you use space and tab characters
  • your makefile does not use options to the javac command
  • which version of make are you trying to build a makefile for? the version I know would take a format like:

    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) $<
    

Makefile 需要编译包,所以我不确定这是否有效。现在正在尝试。 - feldoh
@feldoh,你的包类也应该在SRC变量中定义,可以参考编辑部分的示例。 - rsp
它开始编译,但出现错误,情况如下。1 2 3其中1是一系列成功编译的Java文件,2是Eval.java,3是要编译的后续文件。 3实现了Eval,在编译时出错,抱怨找不到Eval.class,尽管Eval已经在它之前编译过,并且Eval与3在同一个文件夹中。有许多这样的类,无论我如何重新排序文件,它都无法通过实现Eval的第一个文件。但在Eclipse中仍然可以正常编译。 - feldoh
问题在于它似乎无法导入自己包中的内容,是否有特殊的方法来解决这个问题。 - feldoh
你应该将 .java 文件放在一个文件夹中,文件夹的名称应与它们的包名相同。例如,a.b.A.java 应该放在根目录下的 a/b 文件夹中。最快的测试方法是从命令行运行 javac 来编译 Blaise.java,并查看 javac 是否自动编译其他文件或引发警告。将 .java 文件移到它们的包文件夹下,直到 javac 成功为止。 - rsp
显示剩余2条评论

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变量中。

0

通过将antlr添加到类路径中,修复您的javac调用。我真的很讨厌我的计算机科学教授使用的自动化标记脚本。它们基于提交负载随机失败。这里是一个关于Java和Makefiles的不错介绍。基本上尝试使用glob来处理您的.java和.class文件。使用JFLAGS将antlr传递到类路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接