使用 scala sbt 构建一个独立的 jar 以合并到一个 android 项目中

Posted

技术标签:

【中文标题】使用 scala sbt 构建一个独立的 jar 以合并到一个 android 项目中【英文标题】:Building an standalone jar to incorporate into an android project with scala sbt 【发布时间】:2018-02-10 21:39:32 【问题描述】:

我有一个 scala 项目,我想将它作为库依赖项导入到我的 android 项目中。 我的想法是,这应该是一个包含 scala 库和任何其他库的独立 jar(例如,我使用的是 monix)。

我只是不确定使用什么工具来创建这个 jar 以使 android 可以使用它(即确保所有内容都使用 java 7 编译并使用 proguard 处理。)

非常感谢任何正确方向的见解或观点。

我找到了https://github.com/sbt/sbt-onejar,但这似乎不起作用(在我添加生成的 jar 之后,android 似乎无法找到任何实际的类)。

【问题讨论】:

【参考方案1】:

对我来说,以下工作。

我创建了 Scala sbt 项目:

build.sbt

name := "scala_android"
version := "0.1"
scalaVersion := "2.11.11"
javacOptions ++= Seq("-source", "1.7", "-target", "1.7")
scalacOptions += "-target:jvm-1.7"

src/main/scala/mypackage/MyClass.scala

package mypackage

class MyClass 
  def myMethod(): String = "AAA"

我做了sbt updatesbt compilesbt package

现在我有了 jar target/scala-2.11/scala_android_2.11-0.1.jar

然后我使用“Empty Activity”创建了 Android 项目。

我把scala_android_2.11-0.1.jar 放到app/libs

我写在app/build.gradle

dependencies 
    ...

    compile name: 'scala_android_2.11-0.1'
    compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.11'


repositories 
    flatDir 
        dirs 'libs'
    

app/src/main/java/example/com/myapplication/MainActivity.java

package example.com.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import mypackage.MyClass;

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        MyClass obj = new MyClass();
        Log.e("tag", obj.myMethod());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

刷新 Gradle 项目,启动模拟器并运行 MainActivity。

Android 监视器显示在错误级别

09-03 08:47:06.447 6549-6549/? E/tag: AAA 

所以它似乎有效(至少在这样的“hello world”示例中)。

【讨论】:

我基本上可以做到这一点^。在执行 sbt 时,我只需要确保我使用的 jdk 是 java 7(对我来说,我发现的最简单的方法是通过 intellij 设置它)。此外,sbt-assembly 似乎非常适合我的独立需求,我希望在 android 端使用 proguard 会奏效,所以我不需要处理那个 atm。

以上是关于使用 scala sbt 构建一个独立的 jar 以合并到一个 android 项目中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scala sbt 构建多个 jar 文件

如何签署我的 ProGuard 的 Scala 独立 JAR?

创建和使用没有 sbt 的独立 scalaz jar

Sbt 0.13 插件依赖和 scala-reflect.jar 版本冲突

sbt 无法为 scala 版本 2.11.12 创建 jar

学习进度十三(Scala独立应用编程)