将Scala应用程序导出为可运行的JAR

时间:2011-11-09 12:00:09

标签: scala jvm executable-jar

你能否告诉我,如果可以的话,如何将Scala应用程序导出到可直接在JVM中运行的普通可运行JAR? 感谢

5 个答案:

答案 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: _*)

然后你可以用:

生成jar
sbt 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的清单来:

  1. 将scala-library.jar scala-swing.jar包添加到路径
  2. 表示主要课程
  3. 您可以在以下路径中找到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>