我在使用Maven或Eclipse编译一些Scala时遇到问题,我尝试从包含命名空间和同名类的Java jar导入类.但是,
我可以编译scalac.
例如,Java项目(jar)包含:
src/foo/bar.java
src/foo/bar/some_resource.txt
-> foobar.jar
Scala project references foobar.jar
Foobartest.scala:
import foo.bar
class foobartest {
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
package foo contains object and package with same name: bar
one of them needs to be removed from classpath
Run Code Online (Sandbox Code Playgroud)
使用Maven 3.0.03/Eclipse 3.7.1和Scala 2.9.0.1(和maven-scala-plugin).
我遇到问题的jar是jenkins-core-1.399.jar- 它肯定包含几个实例,其中有一个名称空间和同名对象.
我试图在Scala中编写一个Jenkins插件(我可以用Java做这个,但是我更喜欢scala,因为我们所有的库都在scala中),这取决于使用Maven -
https://wiki.jenkins-ci.org/显示/ JENKINS /插件+教程.
我在几个地方看过类似的声明:
"Scala编译器在编译代码中尽可能使用Java数组,原始类型和本机算法"(Scala中的编程书).但实际上我没有看到这一点,例如在下面的代码中,scala类型使用的内存比java类型多(我使用totalMemory和freeMemory方法计算):
long[] la = new Array[java.lang.Long](1024 * 1024);
for(i <- 0 until la.length)
la(i) = new java.lang.Long(0);
val La = new Array[Long](1024 * 1024);
for(i <- 0 until La.length)
La(i) = 0l;
Run Code Online (Sandbox Code Playgroud)
mem_used(java long):>> 28.811M
mem_used(scala long):>> 36.811M
我意识到scala任何类型都有额外的开销,但优化发生在哪里?
我刚刚尝试了Jenkins并设置了一些项目.一个特别是调用shell脚本,并且正确地拾取该脚本的退出代码,从而产生通过/失败.然而,当我从命令行调用Scala时,无论发生什么,它都会通过.
在执行shell框中:
/opt/scala/2.9.1/bin/scala sdfsdfsd
Exception in thread "main" java.lang.RuntimeException:
Cannot figure out how to run target: sdfsdfsd
... (stack trace removed)
Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)
然而,与Java相同的操作会导致失败:
/opt/java/jdk1.7.0/bin/java sdfdfsd
Error: Could not find or load main class sdfdfsd
Finished: FAILURE
Run Code Online (Sandbox Code Playgroud)
当从bash运行时,这两个都产生1的退出代码(使用echo $?)
我错过了什么或这是一个错误吗?
编辑:
有趣的是,我在使用ant exec时看到相同的行为 - 当我调用包含对scala的无效调用的shell脚本时,我得到了预期的错误代码,但是通过ant(使用failonerror ='true')我看到零并且构建成功.
谢谢