我试图在ruby中编写一些代码(使用jruby),用jrubyc编译成java字节码,并部署到远程机器上,它将在JVM上运行(没有可用的ruby).
只要我乐意坚持标准的jruby库,一切都很好.正如在jruby网站上所解释的,我只是将jruby-complete.jar库复制到远程机器并在运行时将其包含在类路径中.我解雇我编译的脚本,它的工作原理:很酷!
当我需要一些其他库(通常是rubygems)来运行我的脚本时,问题就开始了.
我知道很酷的东西,比如rawr,我成功测试了 - 把你所需要的东西放在一个包中.然而,这不是我正在寻找的解决方案:我将有许多小脚本独立运行,我不希望它们中的每一个都增长到至少10 MB只是因为我疯狂地在每个中包含jruby-complete.jar他们.
我想要的是为我需要使用的每个库编译一个.jar,将它们全部放在远程机器上的公共文件夹中,并在运行我编译的jruby脚本时在运行时将它们包含在类路径中JVM.
这就是说,我试着按照这里的说明进行操作:http: //blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
我尝试了完全显示的例子在那里,有"慢性"宝石.一步一步走:
编写两行测试脚本,将其保存为testt.rb:
需要'慢性'
Chronic.parse('明天')
编译:jrubyc testt.rb
我收到以下错误:
异常在线程"主要"文件:/Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar /METAINF/jruby.home/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb:1:在`const_missing'中:
来自testt.rb的未初始化常量Chronic(NameError):2
...内部jruby堆栈
从Module.const_missing(testt.rb:2)中
脱离(未知).(未知)(:1)
我真的不明白我做错了什么,我完全坚持这个.我是Ruby中的菜鸟,更习惯Python:不要错过转换异教徒的机会!:-) 谢谢.
我问并回答我自己的问题,但我不认为我有最好的答案.如果你有一个更好的,请发布它!
相关问题:
我有一对处于简单聚合关系的类:任何一个实例都拥有另一个实例.拥有类具有自己的某种主键,并且拥有的类通过相应的外键与该类具有多对一.我希望拥有的类具有包含该外键的主键以及一些附加信息.
为了争论,让我们使用那些常年的最爱,Order和OrderLine.
SQL看起来像这样:
-- 'order' may have been a poor choice of name, given that it's an SQL keyword!
create table Order_ (
orderId integer primary key
);
create table OrderLine (
orderId integer not null references Order_,
lineNo integer not null,
primary key (orderId, lineNo)
);
Run Code Online (Sandbox Code Playgroud)
我想使用JPA将其映射到Java.订单很简单,OrderLine可以用@IdClass处理.这是代码 - 代码相当传统,我希望你会原谅我的特质.
但是,使用@IdClass涉及编写ID类,该类复制OrderLine中的字段.我想避免重复,所以我想使用@EmbeddedId.
然而,一个天真的尝试这样做失败了:
@Embeddable
public class OrderLineKey {
@ManyToOne
private Order order;
private int lineNo;
}
Run Code Online (Sandbox Code Playgroud)
OpenJPA拒绝将其用作@EmbeddedId.我没有尝试过其他提供程序,但我不希望它们成功,因为JPA规范要求构成ID类的字段是基本的,而不是关系.
那么,我该怎么办?我如何编写一个其键包含@ManyToOne关系的类,但是作为@EmbeddedId处理?
为Rhino的shell开发的一些JavaScript文件使用load()来加载其他JavaScript文件.我正在尝试使用javax.script从这些Rhino JavaScript文件中嵌入一些功能.不幸的是,javax.script的JavaScript没有实现load()函数.尝试eval()包含load()的脚本时,会发生以下错误:
com.sun.script.javascript.RhinoScriptEngine:-1:in `eval': javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.
Run Code Online (Sandbox Code Playgroud)
从Java程序(而不是shell)中评估JavaScript文件时,javax.script是否为load()函数提供了一个?
考虑这个小程序,我们在其中获取一个流,对其进行排序,映射,然后对其进行迭代:
public class AlphabetOrdinals {
private static final List<Character> ALPHABET = List.of('a', 'b', 'c', 'd', 'e', 'f');
private static final int STOP_ORDINAL = 'b' - 'a';
public static void main(String[] args) {
System.out.println("java.runtime.version = " + System.getProperty("java.runtime.version"));
Stream<Integer> ordinals = ALPHABET.stream()
.sorted()
.map(AlphabetOrdinals::ordinal);
int count = 0;
Iterator<Integer> iterator = ordinals.iterator();
while (iterator.hasNext()) {
int ordinal = iterator.next();
if (ordinal > STOP_ORDINAL) {
System.out.println("stopping at " + ordinal);
break;
}
System.out.println("consuming " + ordinal);
++count;
}
System.out.println("consumed " + count …Run Code Online (Sandbox Code Playgroud) 我有一些Java代码,它取决于系统属性super.secret.password.我需要在运行我的应用程序时设置该属性.该应用程序将由shell脚本启动,密码将保存在具有最小读取权限的文件中.
我真的不想写:
java -Dsuper.secret.password=letmein gov.fortknox.MyApp
Run Code Online (Sandbox Code Playgroud)
因为那时任何人都可以进入机器运行ps或者top可以看到密码是什么.
那么,有没有一种很好的方法来设置系统属性而不在命令行上公开它们?
我们提出的唯一通用解决方案是编写一个从文件中读取系统属性的小型C程序,然后使用JNI调用API启动JVM .不用说,我们并不热衷于这样做.
如果没有办法在不使用命令行的情况下设置它们,有没有办法隐藏命令行不被窥探?我们正在使用Red Hat Enterprise Linux Server 5.5.
对于它的价值,有问题的应用程序实际上是JBoss EAP 4.3.0,我们正在使用系统属性${like.this}在其XML配置文件中填写替换构造().有JBoss特定的解决方案 - 使用SystemPropertiesService(默认情况下,通过deploy目录中的properties-service.xml文件配置)或将-P选项传递给run.sh. 但是,我对更一般的情况感兴趣,这可能是任何Java程序.
我想使用优秀的Sass作为构建过程的一部分.我的构建过程由Gradle管理.这意味着编写一个插件来运行Sass.Sass是Ruby,Gradle是Groovy,但是由于Groovy在JVM上运行,我可以使用JRuby来运行它,使用Java 脚本API.Gradle脚本以jar文件的形式获得依赖关系; 我可以从Maven Central获得JRuby ,但我需要自己将Sass打包成jar.
我试图遵循尼克·西格尔(Nick Sieger)的宝石手套来做这件事,但没有成功.无论我做什么,我都无法让JRuby拿起Sass宝石.
为了隔离这个问题,我写了一个最小的Java(不是Gradle)程序试图通过JRuby使用Sass - 我创造性地称之为JSass:
有两三个有趣的位.第一个是脚本generate-gem-jar.sh,它构建了gem jar:
gem install -i build/gems sass --no-rdoc --no-ri
jar cf lib/gemsass.jar -C build/gems .
Run Code Online (Sandbox Code Playgroud)
第二个是运行JRuby 的so.demo.JSass类:
ScriptEngine rubyEngine = new ScriptEngineManager().getEngineByName("jruby");
ScriptContext context = rubyEngine.getContext();
context.setAttribute("inputFile", inputFile, ScriptContext.ENGINE_SCOPE);
String script = IOUtils.toString(JSass.class.getResourceAsStream("sassdriver.rb"));
rubyEngine.eval(script, context);
Run Code Online (Sandbox Code Playgroud)
第三个是主要类试图用来操作Sass的Ruby脚本:
require 'sass'
template = File.load(inputFile)
sass_engine = Sass::Engine.new(template)
output = sass_engine.render
puts output
Run Code Online (Sandbox Code Playgroud)
该程序能够加载JRuby引擎并执行脚本,但它失败了require 'sass',说:
LoadError: …Run Code Online (Sandbox Code Playgroud) 我想创建一个项目,其构建过程包括一些代码生成。生成的代码在编译时依赖于主代码(它扩展了公共基类)和 JCenter 的模块。主代码实际上对生成的代码具有运行时依赖性;也许更正确的说法是应用程序对主代码和生成代码都具有运行时依赖性,以及两者的模块依赖性。
\n\n编辑:为了使依赖关系更清晰,这是一个粗劣的图表,其中箭头从配置指向它所依赖的东西。正如您所看到的,依赖图中没有循环。
\n\nmain compile \xe2\x86\x90 generated compile \xe2\x86\x92 generated module\n \xe2\x86\x91 \xe2\x86\x91\nmain runtime \xe2\x86\x92 generated runtime\nRun Code Online (Sandbox Code Playgroud)\n\n我真的很想将生成的代码放在主代码的单独源集中。我也很想使用应用程序插件来提供gradle run和gradle installDist.
我正在使用最新的 Gradle 3.3。
\n\n我创建了一个项目来尝试这个。其中,源集是:
\n\nsourceSets {\n generated {\n java {\n srcDirs = ["$buildDir/src/generated/java"]\n compileClasspath += sourceSets.main.output\n }\n }\n main {\n java {\n runtimeClasspath += sourceSets.generated.output + sourceSets.generated.runtimeClasspath\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n还有一个生成代码的任务:
\n\ntask generateSource {\n doLast {\n // generate the code into sourceSets.generated.java.srcDirs[0] here\n }\n}\n\ncompileGeneratedJava.dependsOn generateSource\nRun Code Online (Sandbox Code Playgroud)\n\n … 我找不到任何明确描述 QuantLib 线程安全属性的文档(或没有它们!)。QuantLib配置文档列出了许多与线程安全相关的编译时选项,从中我推断,默认情况下,QuantLib 并不完全是线程安全的。
特别是,有:
QL_ENABLE_SESSIONS - “如果定义,单例将为不同的会话返回不同的实例。您必须在命名空间 QuantLib 中提供一个 sessionId() 函数并将其与库链接,为每个会话返回不同的会话 ID。默认情况下未定义。”
QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - “如果定义,将使用观察者模式的线程安全(但性能较低)版本。如果您想通过 JVM 或 .NET 生态系统或任何环境中的 SWIG 层使用 QuantLib,您应该定义它异步垃圾收集器。默认情况下未定义。”
QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - “定义它以使单例初始化线程安全。默认情况下未定义。与多个会话不兼容。”
如果我想使用 QuantLib,我应该使用哪些选项,以及我应该采取哪些其他步骤:
来自多个线程,但永远不会同时(例如,仅在持有全局锁时)?
同时来自多个线程,但不在它们之间共享任何对象?
同时来自多个线程,在它们之间共享对象?
我的应用程序的自然结构是一个有向无环图,在一端输入一个恒定的市场数据流,用于计算和更新各种对象,并在另一端生成一个估计价格流。我非常希望能够让多个内核并行工作,因为有些计算需要很长时间。
该应用程序将主要用 Java 编写,与 QuantLib 接口的 C++ 部分最少。我不打算使用 SWIG 包装器。我很高兴在没有 Java 垃圾收集器帮助的情况下对 QuantLib 对象进行内存管理。
编辑!如果您决定设置这些选项中的任何一个,那么在 unix 上,将相应的标志设置为 ./configure:
--enable-sessions
--enable-thread-safe-observer-pattern
--enable-thread-safe-singleton-init
Run Code Online (Sandbox Code Playgroud) 我正在尝试从HTML5 Boilerplate运行构建脚本,我必须为此安装YUM.我在Mac OS Snow Leopard 10.6.8上.当我这样做时sudo port install yum,我收到以下错误.任何想法我怎样才能纠正它并正确安装yum?
---> Computing dependencies for py24-nose
---> Dependencies to be installed: py24-distribute
---> Activating py24-distribute @0.6.24_0 Error: Target org.macports.activate returned: Image error:
/opt/local/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.egg-info
already exists and does not belong to a registered port. Unable to
activate port py24-distribute. Use 'port -f activate py24-distribute'
to force the activation. Error: Failed to install py24-distribute Log
for py24-distribute is at:
/opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_python_py-distribute/py24-distribute/main.log
Error: The following dependencies were not installed: py24-distribute …Run Code Online (Sandbox Code Playgroud) 我想实现这样的事情:定义一个抽象方法
public abstract void registerError(*any subclass of an ErrorVO or ErrorVO e);
Run Code Online (Sandbox Code Playgroud)
并在实际实现方法的子类中:
public void registerError(ASubclassOfErrorVO e);
Run Code Online (Sandbox Code Playgroud)
非常感谢你的帮助!
java ×3
javax.script ×2
jruby ×2
rubygems ×2
c++ ×1
concurrency ×1
generics ×1
gradle ×1
java-stream ×1
javascript ×1
jboss ×1
jpa ×1
jpa-2.0 ×1
linux ×1
load ×1
macports ×1
many-to-one ×1
quantlib ×1
rhino ×1
ruby ×1
yum ×1