繁体   English   中英

从类文件重建可执行的jar(具有修改的类路径)

[英]Reconstructing an Executable jar (with Modified Class-Path) from Class Files

我正在用Java对作业进行评分。 要求学生实现一个五合一的行(如井字游戏或五人二人游戏)界面,该界面由GUI .java文件使用。 这些文件(接口和GUI)以名为lab2.jar的文件(分别位于cs251/lab2/的名称分别为GomokuModelGomokuGUI )提供给学生,学生必须将其添加到其类路径中。 项目完成后,要求学生上交一个名为Gomoku.java的.java文件。

一名学生上交了一个.jar,但命令

java -jar Gomoku.jar 

回应

Gomoku.jar中没有主清单属性

我认为该学生可能已经忘记/不知道要制作清单文件。 unzip学生的jar文件,仅找到.class文件。 我尝试从这些文件制作自己的jar:

根据规范,主目录必须位于Gomoku.java中,其类为Gomoku.class。 所以我做了一个manifest.txt文件,看起来像

Main-Class: Gomoku
Class-Path: lab2.jar

并尝试使用命令从中制作一个.jar

jar cfm myJar.jar manifest.txt *.class lab2.jar

但是当我使用命令运行此命令时

java -jar myJar.jar

我收到以下错误:

0Exception in thread "main" java.lang.IllegalAccessError: tried to access method cs251.lab2.GomokuGUI.<init>(Lcs251/lab2/GomokuModel;)V from class Gomoku
    at Gomoku.main(Gomoku.java:47)

这个特殊的错误给我带来麻烦。 我从未见过类似的东西,而且我在网络上的研究也没有发现任何东西。 因为该错误表明它来自GomokuGUI(它是lab2.jar文件之一),所以我认为该错误已解决。 我的问题是:

  1. 当我知道并拥有一个文件时,可以制作一个可执行文件.jar吗

    • 类路径中的内容
    • 主要应该在哪里
    • 一组相关的类文件
  2. 如果对(1)的回答为是:我是否以正确的方式进行操作? 我觉得我在某处缺少重新编译的步骤。

在这种情况下,我可能会要求学生重新提交。 然后,我将下载在截止日期之前提交的.jar文件,以确保它们可以运行。 但是出于知识的缘故(我本人制作了仅包含.class而不包含清单的.jar文件),是否有办法挽救上述工作文件?

从JRE javadoc:

公共类IllegalAccessError扩展了IncompatibleClassChangeError

如果应用程序尝试访问或修改字段,或调用它无权访问的方法,则抛出该异常。

你正在

0Exception in thread "main" java.lang.IllegalAccessError: tried to access method
cs251.lab2.GomokuGUI.<init>(Lcs251/lab2/GomokuModel;)V from class Gomoku
    at Gomoku.main(Gomoku.java:47)

它抱怨的方法名为<init> 这就是Java内部调用的构造函数。 据说Gomoku.main()尝试发布new GomokuGUI(model) ,其中模型应该是GomokuModel的实例,但是该构造函数不可访问。 Gomoku.main()与GomokuGUI位于不同的包中这一事实意味着,构造函数必须是公用的,才能正常工作。

您可以通过反射进行检查-实际上,我相信Eclipse可以为您做到这一点-但这几乎是肯定的事情。

因此,要么是学生上交了残破的代码,要么是您在尝试将其强制装入方便执行的jarfile格式时将其破坏了。 在任何情况下,这都是浪费时间,因为您无法根据目标代码对作业进行评分,并且无论如何都将不得不返回并要求提供源代码。

如果您真的想尝试运行学生提交的jarfile,请执行以下操作:返回原始的未修改的jarfile,然后尝试仅运行'java Gomoku -classpath myJar.jar',其中myJar.jar是学生上交的内容。如果不起作用,请尝试使用“ java Lcs251.lab2.Gomoku -classpath myJar.jar”,这可能是他们打算将其放入给定的错误消息中的软件包。 如果这些都不运行,请询问学生他们一直在使用哪个命令行来运行它并尝试。 如果那行不通,那就该调查原因了。

整个可执行jar的问题是一个红色的鲱鱼,并且浪费时间,直到您知道代码实际运行以及入口点实际是什么为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM