0

如果您不知道开发人员使用的具体包,我该如何编译和运行java文件...

我有一个由其他人编写的java文件文件夹,我正在尝试编译和运行java文件,我可以通过运行javac *.java来编译文件,但是如果我尝试通过调用java MainClass来运行主类,我收到如下错误:错误无法找到或加载主类 MainClass,原因是:java.lang.NoClassDefFoundError: SomePackageName/MainClass (wrong name: MainClass)

我不知道开发人员定义的 SomePackageName 是什么,我无法控制它。

所以问题是如果我只知道哪个是主类,我该如何编译和运行 java 文件?

4

1 回答 1

2
  1. 完全限定的类名的形式是:com.foo.Bar,其中com.foo是包(例如定义 Bar 类的文件以行开头package com.foo;),而 Bar 是名称(例如文件包含行public class Bar {)。
  2. 运行java并指定类路径+类名时,您传递一个类名。不是文件名。因此,要运行此文件,您需要编写java -cp /path/to/base com.foo.Bar.
  3. 完全限定名称必须在运行时(类文件)和编译时(java 文件)匹配目录结构。所以,在这里你应该说/Users/Foghunt/projects/myproj/src/com/foo/Bar.java,编译后你应该有例如/Users/Foghunt/projects/myproj/build/com/foo/Bar.class
  4. “基本目录”是包含第一个包目录的目录。因此,源文件的基本目录是/Users/Foghunt/projects/myproj/src,编译结果的基本目录是/Users/Foghunt/projects/myproj/build.
  5. 基本目录需要在类路径中。类路径条目是文件路径。所以,要运行这个东西,你会写java -cp /Users/Foghunt/projects/myproj/build com.foo.Bar.
  6. javac不介意您不经历正确定义事物的麻烦(例如,运行javac *.java确实/Users/Foghunt/projects/myproj/src/com/foo有效),但是如果您有多个包,它会很快变得复杂。
  7. 一般来说,您应该使用构建系统。如果您继承了此项目,请检查项目根目录中是否存在名为build.xmlor的文件。如果存在,请使用网络搜索引擎(-> search for 、-> 、-> ),并使用它来构建项目,不要自己运行。pom.xmlbuild.gradlebuild.xmljava antpom.xmljava mavenbuild.gradlejava gradlejavac

你去吧。有了这些知识,您现在可以分析、构建和运行任何 java 项目。

于 2020-08-27T15:46:28.817 回答