Java 如何在没有包信息的情况下使用jar文件?

Java 如何在没有包信息的情况下使用jar文件?,java,jar,javac,Java,Jar,Javac,我有一个叫“MyTools”的罐子。jar位于c:\data文件夹中。我在同一个文件夹中创建了一个名为“UseTools.java”的新文件。现在我想使用UseTools.java中MyTools.jar中的一些类。我试过这个,但似乎不起作用: import MyTools.*; public class UseTools { public static void main(String[] args) { MyTools.SomeClass foo = new Som

我有一个叫“MyTools”的罐子。jar位于c:\data文件夹中。我在同一个文件夹中创建了一个名为“UseTools.java”的新文件。现在我想使用UseTools.java中MyTools.jar中的一些类。我试过这个,但似乎不起作用:

import MyTools.*;    
public class UseTools
{
  public static void main(String[] args) 
  {
    MyTools.SomeClass foo = new SomeClass();
    SomeClass.doSomething();
  }
}
我试图用以下方法编译此文件:

javac -cp . UseTools.java
并收到以下错误消息:

UseTools.java:1: package MyTools does not exist
import MyTools.*;
^
UseTools.java:7: package MyTools does not exist
        MyTools.SomeClass foo = new SomeClass()
                                     ^
2 errors
我没有在任何类中设置包名


我必须在jar类中设置包名吗?

您需要添加-cp file.jar而不是-cp


后者将仅拾取.class文件。顺便说一句:为什么不使用netbeans、eclipse或intelliJ之类的IDE呢?

在MyTools.jar中应该有一个名为MyTools的包。在编译之前,您应该将jar添加到类路径中。

要提及与问题标题更相关的内容: 在Java中,您不能从命名包中的代码访问默认包中的类

这意味着,如果jar文件中的类不明确属于任何包,并且在jar中,您的文件直接位于根文件夹中,没有子文件夹,则它们位于默认包中。这不是很详细,缺乏模块性和可扩展性,但在技术上还可以。 然后,您只能使用默认包中的代码中的这些类。但这并不一定意味着它必须在同一个罐子里。如果您有多个src或class文件夹,那么它们都可以在可以交互的默认包中包含类JAR文件中的组织和项目中的包结构彼此独立。


但是,我严格鼓励您使用显式的包信息。

我尝试了这个方法,但得到了相同的错误“包不存在”:javac-cp MyTools.jar UseTools.javac您能在命令行上运行'jar-tf MyTools.jar'并发布输出吗?也许您的jar没有正确打包。我使用netbeans创建了jar。当我执行-tf时,它返回一个META-INF文件夹,并且root.first-off包名中的SomeClass.class在Java中应该都是小写的。根目录中的类名应该是CamelCase.SomeClass.class是错误的,它应该在一个名为MyToolsok的目录中,当我使用java运行它时,我还需要在我的类路径中包含jar吗?如果您通过命令控制台运行,那么您设置的类路径将存在,直到您关闭控制台,因此,如果您在编译期间设置了类路径的同一控制台中运行,则无需再次设置。