[有一个使用带通配符*的类路径运行的应用程序
例如java -cp / opt / sampleapp / lib / * Main
具有较旧的joda-time(1.8。)版本,该版本不具有DateTime.now()方法,并且可从2.x版本的joda-time获得。注意:
此joda时间(1.8)被打包到另一个jar(jruby-jar-1.6.8.jar文件)
我正在编写一个使用joda-time(2.x以上)版本的测试应用程序,该版本具有DateTime.now()方法并由我的java类使用。我必须将我的application(jar)文件提交到正在运行的sampleapp才能运行它。不幸的是,在我的测试应用程序执行期间,较旧的版本被选中,这导致
原因:
java.lang.NoSuchMethodError: org.joda.time.DateTime.now()Lorg/joda/time/DateTime;
如果我删除旧版本的jruby(1.6.8.jar)并将其替换为jruby(1.7.18),则不会出现此类错误。我正在使用Maven作为构建工具,并使用Maven阴影插件来创建uber jar。如何在我的应用程序中提及不要在jruby-1.6.8.jar中选择joda-time(1.8)并在测试应用程序中选择正确版本的joda-time-2.x jar文件。
这很困难。
您的jruby JAR通过包含joda time的类来打破规则。我可以想到不同的方法,它们都有缺点:
1.6.8-fixed
之类的版本将其加载到您的maven存储库中。