你能否告诉我,如果可以的话,如何将Scala应用程序导出到可直接在JVM中运行的普通可运行JAR? 感谢
答案 0 :(得分:15)
如果您使用sbt构建,您可以使用其中一个jar插件。他们会将所有的依赖项放入一个大的jar文件中(包括所有的scala.jar文件)。这意味着您只需要一个jar文件,而不必管理所有依赖项。
作为sbt-assembly的示例(主要从https://github.com/sbt/sbt-assembly复制):
项目/ plugins.sbt:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "X.X.X")
build.sbt:
import AssemblyKeys._ // put this at the top of the file
seq(assemblySettings: _*)
然后你可以用:
生成jarsbt assembly
答案 1 :(得分:14)
完全有可能,例如见:running a maven scala project。由于Scala编译为Java字节码,因此JVM甚至不知道底层实现语言。
本质上在使用scalac
编译Scala源代码后,您将获得一堆.class
文件,您可以将这些文件打包到JAR中。然后你可以使用:
$ java -cp "your.jar:scala-library.jar" com.example.Main
请注意,必须在CLASSPATH上包含scala-library.jar
(目前它几乎是9 MiB ...)并指定包含main
方法的类。
答案 2 :(得分:6)
作为Fabian答案的替代方案,如果您使用的是Maven,则可以使用assembly-plugin。类似的东西:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>package-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>true</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifestEntries>
<SplashScreen-Image>splash.png</SplashScreen-Image>
</manifestEntries>
<manifest>
<mainClass>se.aptly.epm.main.PrognosisApp</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
这将打包所有你的deps,包括scala-library.jar(如果它在你的deps中),但是会在所有被解压缩的类中展平。这是因为runnable jar不能开箱即用jar中的jar中的代码。
为了完成这项工作(更好),使用http://code.google.com/p/onejar-maven-plugin/,我认为它是一个罐子的Maven mojo包装器:http://one-jar.sourceforge.net/
还有一个用于一个jar的sbt-plugin: https://github.com/sbt/sbt-onejar
答案 3 :(得分:1)
为了在可运行的jar中打包swing应用程序,对我有用的解决方案是将我的项目导出为普通jar 文件(不可执行)并更新jar的清单来:
您可以在以下路径中找到jar中的清单文件(例如,您可以使用7z打开):
META-INF/MANIFEST.MF
在清单末尾添加以下行:
Main-Class: myPackage.myMainClass
Class-Path: scala-library.jar scala-swing.jar
现在你的jar应该在点击它时正确执行。
注意:您可以在此处找到有关清单自定义的更多信息: http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
答案 4 :(得分:0)
她是我的解决方案,maven - &gt;创建scala
可运行的jar。
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<id>scala-compile-first</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>**/*.scala</include>
</includes>
</configuration>
</execution>
<execution>
<id>scala-test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>xxx.xxx.xxx.Main</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>