我正在寻找一种方法来运行由Intellij制作的用于hello world的标准类文件,它使用将kotlin-stdlib-1.3.11
作为唯一依赖项的gradle构建。
我知道我可以制作一个jar文件并运行它,但这不是问题。这个问题已经在许多地方得到了回答,但是请不要用那些解决方案来回答,因为那不是我要问的问题。
“ hello world”的简单类文件需要访问kotlin-stdlib-1.3.11.jar,我正在寻找一种方法来运行类文件并手动指定用于满足依赖性的jar。 / p>
我正在为团队成员做以下记录:
java HelloKt
在类文件所在的文件夹中的应该给出一个NoClassDefFoundError,并还希望显示出如何手动指定“运行该类,但还要同时具有kotlin std lib”。
我重复一遍,我不是想让程序运行。我试图显示如何运行标准库才能运行类文件。
答案 0 :(得分:0)
这与classpath有关。
简单的答案是运行kotlin
而不是java
,因为这会自动将Kotlin支持添加到类路径中:
> kotlin HelloKt
但是,如果您需要运行java
,则需要自己设置类路径。
java
的{{3}}说:
Java运行时在三组位置中搜索启动类和使用的其他类:引导类路径,已安装的扩展和用户类路径。
前两个是Java安装的一部分,很少涉及,因此它是您需要查看的用户类路径。
您需要它同时包含kotlin-runner.jar
和HelloKt.class
文件的路径。后者可以简单地是当前目录的.
;前者将取决于您在哪里安装Kotlin。 (例如,我使用Homebrew进行安装,而该jar当前为/usr/local/Cellar/kotlin/1.3.31/libexec/lib/kotlin-runner.jar
。)
联机帮助页继续:
-classpath classpath -cp classpath Specifies a list of directories, JAR archives, and ZIP archives to search for class files. Class path entries are separated by colons (:). Specifying -classpath or -cp overrides any setting of the CLASSPATH environment variable. If -classpath and -cp are not used and CLASSPATH is not set, the user class path consists of the current directory (.).
因此,有两种方法可以执行此操作:在运行$CLASSPATH
之前先设置java
环境变量:
> export CLASSPATH="/usr/local/Cellar/kotlin/1.3.31/libexec/lib/kotlin-runner.jar:."
> java HelloKt
或传递-classpath
或-cp
标志:
> java -cp /usr/local/Cellar/kotlin/1.3.31/libexec/lib/kotlin-runner.jar:. HelloKt
(或者,您可以说,您可以构建一个包含Kotlin支持类以及您自己的支持类的jar文件。如果要将其分发到可能未安装Kotlin的机器上,那可能是最好的选择。但这不是唯一的选择。)
答案 1 :(得分:0)
如@gidds所述,是的,它与类路径有关。
命令java HelloKt
告诉Java运行的类是HelloKt
,这是Kotlin为名为Hello
的应用程序提供包含类的类,但是该命令没有确定应在何处运行代码。该代码必须由类路径指定。使用当前目录中的HelloKt.class
文件,然后使用'.'
作为类路径,可以找到HelloKt类并启动代码,但是由于存储库'kotlin-stdlib-1.3,它很快就会死掉gradle构建中指定的.11'也必须可用于提供运行时类。所以
java -cp ".";"<path to stdlib>\kotlin-stdlib-1.3.11.jar"
将成功运行文件。注意,每个jar必须是类路径中的一个条目,仅包含jar的文件夹是不够的。在Windows';'在Mac或Linux上,使用':'分隔条目。每个条目都可以用引号引起来,并且仅当路径中包含特殊字符时才需要。