如何使用这个makefile和src/和bin中的文件正确地生成javajar文件/

如何使用这个makefile和src/和bin中的文件正确地生成javajar文件/,java,jar,makefile,Java,Jar,Makefile,我在为Java实现正确生成Jar时遇到问题。我不是Java大师(因此我使用Make而不是Ant)。直到我意识到我的Windows机器没有javac,我才意识到我不在乎Jar。然后我想:“要是我有个罐子就好了” 所以我在一个Makefile中拼凑了几行 相关线路为: all: client server jar client: bin bin/Job.class bin/JobQueue.class bin/Client.class bin/FileTransfer.class server:

我在为Java实现正确生成Jar时遇到问题。我不是Java大师(因此我使用Make而不是Ant)。直到我意识到我的Windows机器没有javac,我才意识到我不在乎Jar。然后我想:“要是我有个罐子就好了”

所以我在一个Makefile中拼凑了几行

相关线路为:

all: client server jar

client: bin bin/Job.class bin/JobQueue.class bin/Client.class bin/FileTransfer.class

server: bin bin/Job.class bin/JobQueue.class bin/Server.class bin/ServerThread.class bin/FileTransfer.class

jar: client server
    jar cfe HBNQServer Server bin/Server.class bin/Job.class bin/JobQueue.class bin/ServerThread.class bin/FileTransfer.class
    jar cfe HBNQClient Client bin/Client.class bin/Job.class bin/JobQueue.class bin/FileTransfer.class
然而,当我试图运行它时,我得到了一个“找不到类”异常

$ java -jar HBNQServer
Exception in thread "main" java.lang.NoClassDefFoundError: Server
Caused by: java.lang.ClassNotFoundException: Server
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
我相信这个错误对于任何更熟悉“Jaring”文件的人来说都是显而易见的


如果我遗漏了任何重要的代码,可能会发现

如前所述,您的JAR需要一个前缀。

我相信您的问题在于
bin
前缀。如果jar类文件,它必须位于与其完全限定包名相同的目录中。例如,如果实现一个
com.mycompany.Server
类,jar文件中相应的路径必须是
com/mycompany/Server.class
。在您的情况下,所有内容都在jar文件的
bin
目录中,因此它找不到您的(可能是非包限定的)类。要么将所有类放在
bin
包中,要么在没有
bin
前缀的情况下将它们放入jar中

类似的方法可能会奏效:

jar: client server
    cd bin; jar cfe ../HBNQServer Server Server.class Job.class JobQueue.class ServerThread.class FileTransfer.class
    cd bin; jar cfe ../HBNQClient Client Client.class Job.class JobQueue.class FileTransfer.class

顺便说一句,
ant
目标可以方便地用作
make
文件中的命令。我说“使用它来指定应用程序入口点,而不编辑或创建清单文件”是不是误导了我?哎呀,我忽略了这个选项;它在1.6中是新的,我已经使用了
ant
一段时间了。问题正如@Keith Randall所说的那样。使用
jartf
确保包结构与目录结构匹配。“因此,我为什么使用Make而不是Ant”-听起来好像是学习使用Ant的时候了!一个很好的观点。但我只是凡人。我认为用Java实现这一点(在用Ruby实现之后)是学习的一个良好开端:p“…直到我意识到我的Windows机器没有javac”-当然,你可以下载并安装Java JDK for Windows。但是,在Windows上运行Makefiles时,您会遇到问题。这让我们回到“学习蚂蚁”。。。因为Ant文件(更)独立于平台。我不想告诉你们,但我们都只是凡人。甚至是乔恩·斯基特,谢谢你!是的,我的所有文件都在默认名称空间中。我真丢脸。我有很多C方面的经验,但实际上没有Java方面的经验。