我已经放置了一个java文件,并在JRE/lib/ext目录中用main方法编译了它。我想从本地java文件访问该文件,甚至没有提到在java中导入它。
C:\Program Files\Java\jre1.8.0_60\lib\ext>cat TestClass.java
class TestClass
{
public void displayMessage()
{
System.out.println("Hello World of Trials");
}
}
C:\Program Files\Java\jre1.8.0_60\lib\ext>javac TestClass.java
C:\Program Files\Java\jre1.8.0_60\lib\ext>ls -lrt TestClass.*
-rwxrwxr--+ 1 Madhuri None 103 Jun 17 12:23 TestClass.java
-rwxrwx---+ 1 Administrators None 418 Jun 17 12:25 TestClass.class
C:\Program Files\Java\jre1.8.0_60\lib\ext>
C:\Users\Madhuri\Documents>cat TestArt.java
class TestArt
{
public static void main(String args[])
{
TestClass tc = new TestClass();
tc.displayMessage();
}
}
C:\Users\Madhuri\Documents>javac TestArt.java
TestArt.java:5: error: cannot find symbol
TestClass tc = new TestClass();
^
symbol: class TestClass
location: class TestArt
TestArt.java:5: error: cannot find symbol
TestClass tc = new TestClass();
^
symbol: class TestClass
location: class TestArt
2 errors
C:\Users\Madhuri\Documents>
- 一个
从上面的回答,我认为这是可能的。我尝试编译与详细选项,并了解它只接受JAR文件。
C:\Users\Madhuri\Documents>javac -verbose TestArt.java
[parsing started RegularFileObject[TestArt.java]]
[parsing completed 37ms]
[search path for source files: .]
[search path for class files: C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\sunrsasign.jar,C:\Program Files\Java\jdk1.8.0_60
jre\lib\jsse.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar,C:\Program Files\Java\jdk1.8.0_60\jre\classes,C:\Prog
am Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge-64.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jacce
s.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ex
\sunec.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar,C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar,C:\Program Files\Java\jdk1.8
0_60\jre\lib\ext\zipfs.jar,.]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.8.0_60\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.8.0_60\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking TestArt]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.8.0_60\lib\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[loading ZipFileIndexFileObject[C:\Program Files\Java\jdk1.8.0_60\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
TestArt.java:5: error: cannot find symbol
TestClass tc = new TestClass();
^
symbol: class TestClass
location: class TestArt
TestArt.java:5: error: cannot find symbol
TestClass tc = new TestClass();
^
symbol: class TestClass
location: class TestArt
[total 570ms]
2 errors
C:\Users\Madhuri\Documents>
我需要在ext目录中创建一个JAR文件来自动加载它吗?或者有没有办法直接由程序加载类文件?
2条答案
按热度按时间ni65a41a1#
不可能从本地Java文件访问类而不将其导入java中。即使您将该java文件复制到JRE/lib/ext目录中,并希望在其他类中访问它,但这并不意味着所需的类不会添加到默认类路径中。
yzxexxkh2#
这是可行的(如果你正在使用你的个人机器),但不推荐,如果该环境,特别是JVM用于更多的Java系统。换句话说,这是一个坏的做法。
当您将jar文件或类放入该文件夹时,任何使用该JVM的Java进程都会加载它,这是潜在冲突的一个重要来源,意味着类加载问题,如nosuchmethoderror、classnotfoundexception等。
jre/lib/ext文件夹只是用来扩展JVM的核心功能,这意味着它与您的程序无关。
相反,使用CLASSPATH来引用定制的jar文件或类。
您可以使用类加载调试标志(-verbose:class)来了解类是从哪里加载的。
参考:
什么是核心扩展?
https://docs.oracle.com/javase/8/docs/technotes/guides/extensions/
如何使用CLASSPATH:
https://docs.oracle.com/javase/tutorial/essential/environment/paths.html