【问题标题】:How to compile and run java programs ignoring package info?如何编译和运行忽略包信息的java程序?
【发布时间】:2021-07-21 08:01:05
【问题描述】:

我有一堆 .java 文件。它们都有相同的类名public MyClass。他们都有一个main 方法。他们都可能在顶部有一个package 声明,也可能没有,我不知道提前。

我正在尝试编写一个脚本来编译和运行这些 java 程序。这对于没有package 声明的文件来说很容易......我只是做了一些cp 操作来设置,javac MyClass.javajava MyClass,然后rm 进行拆卸。但是,带有package 声明的文件需要特别注意。我有几个选择,包括删除package 行,或尝试读取package 行,以便我知道生成的目录结构应该是什么。这两个都需要我去解析.java文件,这让我很难过。

有没有办法编译和运行这些文件而不必解析.java 文件?比如:

javac --ignore_package_structure MyClass.java 

会很理想,但快速浏览一下javac 手册页表明这样的事情不存在。

【问题讨论】:

  • 你是说你所有的文件都命名为MyClass.java?公共类名必须与文件名相同(不带.java)。
  • 是的,它们都被命名为MyClass.java。我的意思是我有许多不同的 java 程序(这些是学生提交的)。我想分别编译和运行它们。
  • (these are student submissions) 当您运行MyClass 文件时,您如何决定哪个学生获得该结果的学分?
  • @ublec 仅当类是 public 时才被执行。
  • @markspace 文件是有组织的,所以我知道哪个文件属于谁...

标签: java javac


【解决方案1】:

没有任何简单的方法可以做到这一点。不过,您可以使用正则表达式,并用这个简单的 java 正则表达式替换所有导入:

"package \w+;"g

简单地说,您创建一个 Java 程序来替换所有包名。 如何替换文件:Find and replace words/lines in a file

【讨论】:

    【解决方案2】:

    如果我们可以假设每个学生提交一个名为HelloWorld.java的单个源文件,那么我们可以使用JEP 330在Java 11:

    java HelloWorld.java
    

    我们不首先运行javac,我们没有得到.class 文件(不需要清理),并且任何package 声明都会自动处理。

    请记住,学生仍然可以使用许多课程,只需将它们全部提交给一个源文件即可。

    类的名称甚至无关紧要。执行源文件中的第一个类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2011-06-18
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多