使用锡兰导入罐

Working with ceylon import-jar

如何使用 ceylon import-jar 命令将库从 maven central 导入到项目中?

请显示完整命令。

例如对于 "joda-time-2.9.4.jar" 从“http://repo.maven.apache.org/maven2/”到本地目录。

我猜一定是:

./ceylon-1.2.3/bin/ceylon import-jar --rep  "http://repo.maven.apache.org/maven2/" --verbose --out localdir "joda-time:joda-time/2.9.4" "joda-time-2.9.4.jar"

但据我所知该工具无法正常工作(锡兰版本 1.2.2 和 1.2.3)。

使用 Maven Central 是必不可少的。

这个问题与 相关联,因为这两个工具都为我提供了一个谜语。

1.作为对我的问题的(部分)回答,结果证明这是有效的:

$ ../bin/ceylon import-jar --rep flat:"../flat/" Jama/1.0.3 ../flat/Jama-1.0.3.jar

我手动下载了 jar(在本例中为 Jama-1.0。3.jar),然后我能够导入它。

我不得不尝试很多来找出前缀 "flat:" 的放置位置,即要么将其放在模块描述符 "module.ceylon" 中的 "import" 之后,要么放在命令行上.事实证明后者是正确的选择。

但是,我仍然无法找到如何使用 import-jar 工具直接从 maven 导入 jar。

2。需要有关管理模块的更详细的文档。具体来说,应该澄清术语 "legacy repository" 的含义。

"legacy"是指"deprecated"吗?

3。希望下面这种导入依赖到项目的方式不被认为是"legacy"或者"deprecated":

a) 重命名 jar 文件,使名称反映 jar 中的压缩目录结构。

b) 将 jar 放入一个目录结构中,该目录结构再次反映了 jar 中的目录结构。

c) 将所有内容放入项目的模块目录,必要时合并目录。

这似乎是将依赖项包含到项目中的最明确和可靠的方式,我希望这种方式在任何时候都不会被弃用或考虑 "legacy"。

我了解到您具体询问的是锡兰 import-jar 工具,但如果您的目标是从远程存储库导入 jar,我想提供一个更简单的不同解决方案。

我建议你使用我写的Ceylon Gradle Plugin

它知道如何从存储库中获取依赖项(包括 JCenter 和 Maven Central,还有很多其他的),它会自动为您 运行ceylon -import-jar 工具。

完整示例:

  1. 运行以下命令创建一个新的测试项目(文件夹名称输入simple):

ceylon new simple --module-name=com.athaydes.test --module-version=1.0

  1. 输入新的项目名称,看看里面有什么(最小锡兰项目):

cd simple

tree # or use Finder, Window Explorer or whatever

你会看到这个:

    └── source
        └── com
            └── athaydes
                └── test
                    ├── module.ceylon
                    ├── package.ceylon
                    └── run.ceylon
  1. 编辑 module.ceylon 使其具有以下内容(添加您想要的任何依赖项):
    module com.athaydes.test "1.0" {
      native("jvm")
      import joda_time.joda_time "2.9.4";
    }

Notice the name of the module must be a valid Ceylon identifier! So, the Gradle plugin replaces invalid characters with _, generating a valid Ceylon identifier from the Maven artifact name.

  1. 在项目根目录创建一个build.gradle文件,这样Gradle插件就可以工作了,内容如下:
    plugins {
        id "com.athaydes.ceylon" version "1.2.0"
    }

    repositories {
        jcenter()
    }

    ceylon {
        module = "com.athaydes.test"
        flatClasspath = false
        importJars = true
        forceImports = true // necessary to bypass optional dependencies issues in Maven poms
    }

    dependencies {
        ceylonCompile "joda-time:joda-time:2.9.4"
    }

We must declare this dependency here as a normal Maven dependency so Gradle knows where to get the Jars from.

  1. 完成...现在只需 运行 importJars:

gradle importJars

或者,只查看实际生成的命令(实际上不会运行):

gradle -P get-ceylon-command importJars

这是生成的命令:

ceylon import-jar   
  --force  
  --descriptor=/Users/renato/programming/experiments/ceylon-gradle/simple/build/module-descriptors/joda_time_2.9.4.properties  
  --out=/Users/renato/programming/experiments/ceylon-gradle/simple/modules  
  --rep=aether:/Users/renato/programming/experiments/ceylon-gradle/simple/build/maven-settings.xml 
  --rep=/Users/renato/programming/experiments/ceylon-gradle/simple/modules
  joda_time.joda_time/2.9.4
  /Users/renato/.gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.9.4/1c295b462f16702ebe720bbb08f62e1ba80da41b/joda-time-2.9.4.jar

jar 将导入到默认位置,modules(但您可以对其进行配置):

── build
│   ├── dependency-poms
│   │   └── joda-time-2.9.4.pom
│   ├── maven-repository
│   │   └── joda-time
│   │       └── joda-time
│   │           └── 2.9.4
│   │               ├── joda-time-2.9.4.jar
│   │               └── joda-time-2.9.4.pom
│   ├── maven-settings.xml
│   └── module-descriptors
│       └── joda_time_2.9.4.properties
├── build.gradle
├── modules
│   └── joda_time
│       └── joda_time
│           └── 2.9.4
│               ├── joda_time.joda_time-2.9.4.jar
│               ├── joda_time.joda_time-2.9.4.jar.sha1
│               └── module.properties
└── source
    └── com
        └── athaydes
            └── test
                ├── module.ceylon
                ├── package.ceylon
                └── run.ceylon

现在您可以 运行 带有 runCeylon 任务的 Ceylon 代码(如果没有其他同名任务,则可以 run):

gradle run

注意:

不幸的是,实际上将您选择的特定 Jar 导入到 Ceylon 存储库中是不可能使用其原始名称的...因为在 Ceylon 中,joda-time 是非法标识符...因此您需要更改名称由 Ceylon 导入时的模块。 Gradle 插件为你做..但你需要知道有效的标识符是什么才能在模块文件中写入导入语句(你可以让插件 运行 和它会告诉你名字是什么)。


更简单的方法

如果你想避免这种方法的复杂性,你可以只使用默认的 Gradle 插件方法不将 Maven jar 导入 Ceylon 存储库,只使用简单的 Java 类路径(这意味着您放弃使用 Ceylon 模块系统!)。

如果这样做,您的 build.gradle 文件将如下所示:

plugins {
    id "com.athaydes.ceylon" version "1.2.0"
}

repositories {
    jcenter()
}

ceylon {
    module = "com.athaydes.test"
}

和 module.ceylon 文件:

module com.athaydes.test "1.0" {
  native("jvm")
  import "joda-time:joda-time" "2.9.4";
}

Notice that we don't need to mess up with the dependency name using this approach. From Ceylon 1.2.3, you should prepend the dependency with the maven: qualifier to avoid warnings.

就这么简单!