2011-11-09 89 views

回答

14

這是完全可能的,請參閱例如:running a maven scala project。由於Scala編譯爲Java字節碼,JVM甚至不知道底層的實現語言。

本質上,在使用scalac編譯Scala資源之後,您將得到一堆.class文件,您可以稍後將其打包到JAR中。然後,你可以使用簡單的運行它們:

$ java -cp "your.jar:scala-library.jar" com.example.Main 

請注意,您必須包括scala-library.jar的CLASSPATH(目前它幾乎是9 MIB ...)並指定包含main方法類。

15

如果你使用sbt來構建,你可以使用其中的一個jar插件。他們將把所有的依賴關係放入一個大的jar文件(包括所有的scala.jar文件)。這意味着你只需要一個jar文件,不必管理所有的依賴項。

與SBT-組件(主要來自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: _*) 

然後就可以生成罐子用:

sbt assembly 
+1

該網址無效。嘗試https://github.com/sbt/sbt-assembly –

5

作爲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起來,包括斯卡拉 - library.jar(如果它在你的DEPS),但這樣做有解開所有類夷爲平地。這是因爲可運行jar無法在jar中使用jar中的代碼。

,使這項工作(這是更好),使用http://code.google.com/p/onejar-maven-plugin/,我認爲這是一個Maven的魔力包裝到一個罐子:http://one-jar.sourceforge.net/

還爲一個廣口瓶中的SBT-插件: https://github.com/sbt/sbt-onejar

1

爲了打包運行的JAR Swing應用程序,爲我工作的解決方案是我的項目導出爲正常的jar文件(非執行),並更新JAR的清單到:

  1. add scala-library.jar scala-swing。jar包的路徑
  2. 表明主類

您可以在以下路徑的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

0

她是我的解決方案,maven - >創建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> 
相關問題