2011-11-09 34 views

Trả lời

14

Hoàn toàn có thể, xem ví dụ: running a maven scala project. Vì Scala biên dịch sang Java bytecode, JVM thậm chí không nhận thức được ngôn ngữ triển khai cơ bản.

Về bản chất sau khi biên dịch các nguồn Scala bằng cách sử dụng scalac, bạn sẽ nhận được một bó các tệp .class mà sau này bạn có thể đóng gói vào một JAR. Sau đó, bạn chỉ có thể chạy chúng bằng cách sử:

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

Lưu ý rằng bạn phải bao gồm scala-library.jar trên CLASSPATH (hiện tại nó gần như là 9 MiB ...) và chỉ định lớp chứa main phương pháp.

15

Nếu bạn sử dụng sbt để xây dựng, bạn có thể sử dụng một trong các plugin một-jar. Họ sẽ đặt tất cả các dependencys vào một tệp jar lớn (bao gồm tất cả các tệp scala.jar). Điều này có nghĩa là bạn chỉ cần một tệp jar và không phải quản lý tất cả các tệp phụ thuộc.

Như một ví dụ với SBT-lắp ráp (chủ yếu là sao chép từ https://github.com/sbt/sbt-assembly):

dự án/plugins.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "X.X.X") 

build.sbt:

import AssemblyKeys._ // put this at the top of the file 
seq(assemblySettings: _*) 

sau đó bạn có thể tạo ra bình với:

sbt assembly 
+1

Url đó không hoạt động. Thử https://github.com/sbt/sbt-assembly –

5

Để thay thế cho câu trả lời của Fabian, nếu bạn đang sử dụng Maven, bạn có thể sử dụng plugin lắp ráp. Một cái gì đó như:

<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> 

Điều đó sẽ gói tất cả DEPS của bạn lên, trong đó có scala-library.jar (nếu đó là trong DEPS của bạn), nhưng sẽ làm như vậy phẳng với mọi tầng lớp giải nén. Điều này là do jar của runnable không thể ra khỏi mã sử dụng hộp trong lọ trong bình.

Để đảm rằng công việc (đó là đẹp hơn), sử dụng http://code.google.com/p/onejar-maven-plugin/, tôi nghĩ rằng đó là một Maven mojo wrapper để một jar: http://one-jar.sourceforge.net/

Ngoài ra còn có một SBT-plugin cho một jar: https://github.com/sbt/sbt-onejar

1

để gói một ứng dụng swing trong một jar Runnable, các giải pháp mà làm việc cho tôi là để xuất khẩu dự án của tôi như một bình thường jar tập tin (không thực thi) và cập nhật của jar manifest tới:

  1. thêm scala-library.jar scala-swing.gói jar vào con đường
  2. cho biết lớp chính

Bạn có thể tìm thấy các tập tin Manifest bên trong lọ (mà bạn có thể mở ra với 7z ví dụ) tại đường dẫn sau:

META-INF/MANIFEST.MF 

Add các dòng sau ở cuối tệp kê khai:

Main-Class: myPackage.myMainClass 
Class-Path: scala-library.jar scala-swing.jar 

Bây giờ bình của bạn nên thực hiện đúng khi nhấp vào nó.

LƯU Ý: Bạn có thể tìm thêm thông tin về tệp kê khai tùy chỉnh tại đây: http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html.

0

Hers là giải pháp của tôi, maven -> tạo scala jar chạy được.

 <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> 
Các vấn đề liên quan