如何运行kotlin类文件并指定一个或多个库jar文件?

时间:2019-06-11 11:53:17

标签: java intellij-idea kotlin jvm

我正在寻找一种方法来运行由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”。

我重复一遍,我不是想让程序运行。我试图显示如何运行标准库才能运行类文件。

2 个答案:

答案 0 :(得分:0)

这与classpath有关。

简单的答案是运行kotlin而不是java,因为这会自动将Kotlin支持添加到类路径中:

> kotlin HelloKt

但是,如果您需要运行java,则需要自己设置类路径。

java的{​​{3}}说:

  

Java运行时在三组位置中搜索启动类和使用的其他类:引导类路径,已安装的扩展和用户类路径。

前两个是Java安装的一部分,很少涉及,因此它是您需要查看的用户类路径。

您需要它同时包含kotlin-runner.jarHelloKt.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上,使用':'分隔条目。每个条目都可以用引号引起来,并且仅当路径中包含特殊字符时才需要。