【问题标题】:Java: Compiling and running multiple packages from the command-lineJava:从命令行编译和运行多个包
【发布时间】:2013-09-25 15:01:55
【问题描述】:

我创建了多个包并想要编译和运行它们。我摆弄了javacjava 并了解了如何命名包以及如何构建项目。我希望我没事。但是我在编译和运行这些东西时失败了。我知道我可以为此使用 IDE,但出于好奇,我想使用命令行工具进行尝试。 以下是我的项目的组织方式:

Project
  + src
    + net
      + chris
        + dojo
            - Program.java
          + datastructures
            - Queue.java
            - LinkedList.java
          + sorting
            - MergeSort.java
  + bin
    + net
      + chris
        + dojo
            - Program.class (should be here but missing because compilation fails)
          + datastructures
            - Queue.class
            - LinkedList.class
          + sorting
            - MergeSort.class

“数据结构”和“排序”包中的类的编译工作正常。这是我使用的命令。 “bin”文件夹中的文件夹结构由编译器自动创建。

javac -d bin src\net\chris\dojo\datastructures\*.java
javac -d bin src\net\chris\dojo\sorting\*.java

问题是当我尝试编译“Program.java”(这是我从命令行运行的测试类)时,编译器抛出错误,因为它找不到包“net.chris.dojo.datastructures”和“net.chris.dojo.sorting”。 下面是编译命令:

javac -d bin src\net\chris\dojo\Program.java

这是我得到的输出:

src\net\chris\dojo\Program.java:3: error: cannot find symbol
import net.chris.dojo.datastructures;
                     ^
symbol:   class datastructures
location: package net.chris.dojo
src\net\chris\dojo\Program.java:4: error: cannot find symbol
import net.chris.dojo.sorting;
                     ^
symbol:   class sorting
location: package net.chris.dojo
src\net\chris\dojo\Program.java:11: error: cannot find symbol
            MergeSort.sort(values);
            ^
symbol:   variable MergeSort
location: class Program
src\net\chris\dojo\Program.java:12: error: cannot find symbol
            Queue queue = new Queue();
            ^
symbol:   class Queue
location: class Program
src\net\chris\dojo\Program.java:12: error: cannot find symbol
            Queue queue = new Queue();
                              ^
symbol:   class Queue
location: class Program
src\net\chris\dojo\Program.java:13: error: cannot find symbol
            LinkedList list = new LinkedList();
            ^
symbol:   class LinkedList
location: class Program
src\net\chris\dojo\Program.java:13: error: cannot find symbol
            LinkedList list = new LinkedList();
                                  ^
symbol:   class LinkedList
location: class Program
7 errors

这是我的类文件的代码:

队列.java

package net.chris.dojo.datastructures;

public class Queue {
    ...
}

LinkedList.java

package net.chris.dojo.datastructures;

public class LinkedList {
    ...
}

MergeSort.java

package net.chris.dojo.sorting;

public class MergeSort {
    ...
}

程序.java

package net.chris.dojo;

import net.chris.dojo.datastructures;
import net.chris.dojo.sorting;

public class Program {

    public static void main(String[] args) {
        int[] values = { 9, 4, 6, 2, 0, 3, 8, 1, 7, 5 };
        MergeSort.sort(values);
        Queue queue = new Queue();
        LinkedList list = new LinkedList();
    }

}

我会用这个命令运行它:

java -cp bin net.chris.dojo.Program

我在项目的根文件夹中执行所有命令。 感谢您的帮助。

【问题讨论】:

  • 看看 ANT (ant.apache.org)。命令行很好,但处理类路径可能有点痛苦。顺便说一句,更改您的导入并在 javac 命令行上指定一个类路径。
  • 我的意思是编译后将 javac -d bin src\net\chris\dojo\Program.java 更改为 javac -d bin -cp bin src\net\chris\dojo\Program.java你的包裹。
  • 感谢工作!所以每次当我想编译一个使用其他包中的类的类时,我应该包括-cp 选项来告诉javac 在哪里可以找到这些包?
  • @BigMike 您能否发表您的评论作为答案,以便我将此问题标记为已回答?
  • 别担心。只要你解决了你的问题就好了。但真正了解一下 ANT 以便编写脚本,以后会省去很多麻烦。

标签: java command-line compilation javac


【解决方案1】:

解决方案是在编译时包含类路径。这样它就可以找到它所依赖的包。

javac -d bin -cp bin src\net\chris\dojo\Program.java

感谢@BigMike 的解决方案。

【讨论】:

    【解决方案2】:

    尝试在您的 Program 类中更改此设置

    import net.chris.dojo.datastructures;
    import net.chris.dojo.sorting;
    

    import net.chris.dojo.datastructures.*;
    import net.chris.dojo.sorting.*;
    

    当你编译你的 Program.java 时使用以下命令

    javac -d bin src\net\chris\dojo\Program.java -classpath bin
    

    【讨论】:

    • 没有改变任何东西。我仍然得到这 7 个错误。我来自 C# 背景,并认为这就像导入命名空间。如果是这样,为什么是星号?
    • @urbaindepuce 您可以使用 .* 从指定包中导入所有类和接口。您可以导入特定的类,如import net.chris.dojo.sorting.MergeSort,但不能像在代码中那样导入包本身。 See docs
    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 2013-12-26
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多