Bla*_*man 303 java classpath apache-velocity
我刚读这行:
format()方法的第一件事是从名为output.vm的类路径加载Velocity模板
在这种情况下,我无法弄清楚classpath的含义.
小智 492
在Java中编程时,通过在源文件的顶部放置类似的内容,可以使其他类可用于您正在编写的类:
import org.javaguy.coolframework.MyClass;
Run Code Online (Sandbox Code Playgroud)
或者有时你通过说:"大量导入"东西:
import org.javaguy.coolframework.*;
Run Code Online (Sandbox Code Playgroud)
所以稍后在您的计划中,当您说:
MyClass mine = new MyClass();
Run Code Online (Sandbox Code Playgroud)
Java虚拟机将知道在哪里可以找到已编译的类.
让VM查看机器上的每个文件夹是不切实际的,因此您必须为VM提供要查看的位置列表.这是通过将文件夹和jar文件放在类路径上来完成的.
在我们讨论如何设置类路径之前,让我们来谈谈.class文件,包和.jar文件.
首先,假设MyClass是您作为项目的一部分构建的,它位于项目的一个目录中output..class文件将与output/org/javaguy/coolframework/MyClass.class(以及该包中的每个其他文件一起).为了获取该文件,您的路径只需要包含文件夹'output',而不是整个包结构,因为您的import语句将所有信息提供给VM.
现在让我们假设您将CoolFramework捆绑到.jar文件中,并将CoolFramework.jar放入项目的lib目录中.您现在需要lib/CoolFramework.jar进入类路径.VM将查看该org/javaguy/coolframework部件的jar文件,并找到您的类.
所以,类路径包含:
你如何设置类路径?
每个人似乎都学习的第一种方式是使用环境变量.在unix机器上,你可以这样说:
export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/
Run Code Online (Sandbox Code Playgroud)
在Windows计算机上,您必须转到环境设置,并添加或修改已存在的值.
第二种方法是-cp在启动Java时使用该参数,如下所示:
java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/" MyMainClass
Run Code Online (Sandbox Code Playgroud)
这种方法的一种变体是第三种方法,通常使用.sh或.bat计算类路径的文件来完成,并通过-cp参数将其传递给Java .
那么最好的方法是什么?
通过环境变量全局设置内容很糟糕,通常是出于全局变量不好的相同原因.您更改CLASSPATH环境变量,以便一个程序工作,并最终破坏另一个程序.
-cp是要走的路.我通常确保我的CLASSPATH环境变量是一个空字符串,我尽可能地开发它,以便我避免全局类路径问题(当全局类路径为空时,一些工具不高兴 - 我知道两个常见的,千兆美元许可的J2EE和Java服务器,它们的命令行工具存在这种问题).
Ala*_*uba 64
类路径是Java世界中的基本概念之一,它经常被Java程序误解或根本不理解,尤其是初学者。
简单地说,这classpath只是set of pathsjava编译器和JVM必须找到所需的类来编译或执行其他类的地方。
让我们从一个例子开始,假设我们有一个Main.java文件C:\Users\HP\Desktop\org\example,
package org.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,假设我们在C:\目录下,并且想要编译我们的类,这很简单,只需运行:
javac .\Users\HP\Desktop\org\example\Main.java
Run Code Online (Sandbox Code Playgroud)
现在对于难题,我们位于同一个文件夹中C:\,并且想要运行编译后的类。
不管你认为答案是什么,正确的答案是:
java -cp .\Users\HP\Desktop org.example.Main
Run Code Online (Sandbox Code Playgroud)
首先,我将解释为什么我们想要的类的名称不是org.exmaple.MainMain 、 Main.class或. \users\hp\desktop\org\example\Main.class!这就是包下声明的类的工作原理。
现在,我们向 JVM 提供了类的名称(在本例中为 java 命令),但是它 (JVM) 如何知道在哪里可以找到主类的 .class 文件呢?classpath这就是出现的地方。使用-cp标志(-classpath 的快捷方式),我们告诉 JVM 我们的 Main.class 文件将位于C:\users\hp\Desktop.. 事实上,不是真的,我们告诉它just go to the Desktop directory, and, because of the name of the class org.example.Main, the JVM is smart and it will go from Desktop to org directory, and from org to example directory, searching for Main.class file,它会找到它并杀死它,我的意思是,它会运行它:D。
现在假设在 Main 类中我们想要使用另一个名为that's insideorg.apache.commons.lang3.StringUtils的 jar 文件,后者位于. 所以 Main.java 现在看起来像这样:commons-lang3-3.10.jarC:\Users\HP\Downloads
javac .\Users\HP\Desktop\org\example\Main.java
Run Code Online (Sandbox Code Playgroud)
如果我们总是在里面,如何编译Main.java C:\?答案是:
javac -cp .\Users\HP\Downloads\commons-lang3-3.10.jar .\Users\HP\Desktop\org\example\Main.java
Run Code Online (Sandbox Code Playgroud)
.\Users\HP\Desktop\org\example\Main.java是因为我们的 .java 文件位于文件系统中。
-cp .\Users\HP\Downloads\commons-lang3-3.10.jar是因为java编译器(在本例中为javac)需要知道类org.apache.commons.lang3.StringUtils的位置,所以我们提供了jar文件的路径,然后编译器将进入jar文件并尝试在目录中查找文件 StringUtils.class org\apache\commons\lang3。
如果我们想运行 Main.class 文件,我们将执行:
java -cp ".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar" org.example.Main
Run Code Online (Sandbox Code Playgroud)
org.example.Main是班级的名称。
".\Users\HP\Desktop\;.\Users\HP\Downloads\commons-lang3-3.10.jar"是 Main 和 StringUtils 类的路径(在 Windows 中用 ; 分隔)。
小智 60
可以把它想象成Java对PATH环境变量的回答 - 操作系统在PATH上搜索EXE,Java在类路径上搜索类和包.
就像泉水般的问题一样.
在这种情况下,类路径与在一般情况下完全相同:VM知道的任何地方都可以找到要加载的类以及资源(例如您的情况下的output.vm)。
我知道Velocity希望在“无包”中的任何位置找到一个名为output.vm的文件。这可以是一个JAR,常规文件夹,...应用程序的类路径中任何位置的根。