使用锡兰导入罐
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 工具。
完整示例:
- 运行以下命令创建一个新的测试项目(文件夹名称输入
simple
):
ceylon new simple --module-name=com.athaydes.test --module-version=1.0
- 输入新的项目名称,看看里面有什么(最小锡兰项目):
cd simple
tree # or use Finder, Window Explorer or whatever
你会看到这个:
└── source
└── com
└── athaydes
└── test
├── module.ceylon
├── package.ceylon
└── run.ceylon
- 编辑
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.
- 在项目根目录创建一个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.
- 完成...现在只需 运行 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.
就这么简单!
如何使用 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 工具。
完整示例:
- 运行以下命令创建一个新的测试项目(文件夹名称输入
simple
):
ceylon new simple --module-name=com.athaydes.test --module-version=1.0
- 输入新的项目名称,看看里面有什么(最小锡兰项目):
cd simple
tree # or use Finder, Window Explorer or whatever
你会看到这个:
└── source └── com └── athaydes └── test ├── module.ceylon ├── package.ceylon └── run.ceylon
- 编辑
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.
- 在项目根目录创建一个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.
- 完成...现在只需 运行 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.
就这么简单!