运行一个Java程序,该程序依赖于Shell中的其他类

时间:2019-02-19 06:45:20

标签: 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
                                    ^

1 个答案:

答案 0 :(得分:1)

这样做的原因是编译器不知道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