java - 从 shell 运行依赖于其他类的 java 程序
问题描述
比如说,目录结构如下所示:
src/
- A.java
- A_b.java
- A_c.java
对于初学者/业余阶段,不使用像 maven 或 gradle 这样的构建系统,甚至很少构建 jar 来打包所有类,并使它们可导出。
内容A_b.java
:
public class A_b {
public static void writeWords() {
System.out.println("words");
}
}
内容A_c.java
:
public class A_c {
public static void writeMoreWords() {
System.out.println("more words");
}
}
内容A.java
:
public class A {
public static void main(String[] args) {
String name = "anonymous";
for (int i = 0; i < args.length; i++)
if (args[i].equals("-name"))
name = args[i+1];
System.out.println(String.format("Hello, %s!", name));
System.out.println("Now A_b will write some words:");
A_b.writeWords();
System.out.println("Now A_c will write some more words:");
A_c.writeMoreWords();
}
}
当我尝试这样做时:
$ ls
data src
$ javac src/A.java
我收到一条错误消息:
src/A.java:11: error: cannot find symbol
A_b.writeWords();
^
symbol: variable A_b
location: class A
src/A.java:13: error: cannot find symbol
A_c.writeMoreWords();
^
symbol: variable A_c
location: class A
2 errors
^
解决方案
原因是编译器不知道A.java
编译需要哪些其他文件——这被称为类路径。默认情况下,大多数版本的编译器会将位于同一级别的所有 java 文件视为类路径的一部分,这就是它起作用的原因:
$ cd src
$ javac A.java
但这并不
$ java src/A.java
现在,为了确保我们可以从顶层开始工作,我们需要确保类路径设置正确。
实现这一点的一种方法是明确每个依赖项,如下所示:
$ javac -cp . src/A.java src/A_b.java src/A_c.java
或者,这也有效:
$ javac -cp . src/*.java
还有可以在调用CLASSPATH
之前设置的环境变量,如下所示:javac
$ CLASSPATH=$(pwd)/src javac src/A.java
要获取*.class
在当前工作目录中创建的文件,我们有以下-d
标志:
$ CLASSPATH=$(pwd)/src javac -d . src/A.java
然后,很容易运行它:
$ java A -name world
Hello, world!
Now A_b will write some words:
words
Now A_c will write some more words:
more words
推荐阅读
- swift - 匹配集合中的元素,不同类型,公共元素
- c# - 标签在将其归为父母后消失
- python - OrientDB Gremlin 服务器在 python 中不工作
- mysql - 我不知道如何在 Laravel 中将表连接到另一个表
- android - SetClipToOutline 不适用于 RecyclerView
- c# - 应该添加到列表开头的简单 C# 节点列表函数不能用作外部静态 Void
- keras - 在定义新的损失函数时为 keras 中的张量赋值
- python - python中的随机mac地址生成器
- php - 注销后用户未重定向回上次访问的页面
- python - 如何从命令行列出应用的迁移?