Java 如何排除打包为应用程序uber jar的jar文件

Java 如何排除打包为应用程序uber jar的jar文件,java,maven,build,pom.xml,maven-plugin,Java,Maven,Build,Pom.xml,Maven Plugin,有一个应用程序使用带有通配符的类路径运行* e、 g java-cp/opt/sampleapp/lib/*Main 它有较旧版本的joda time(1.8.),没有DateTime.now()方法,可从joda time的2.x版本获得。 注意: 这个joda时间(1.8)被打包到另一个jar(jruby-jar-1.6.8.jar)中 文件) 我正在编写一个测试应用程序,它使用的是JodaTime(2.x以上)版本,该版本具有DateTime.now()方法&由我的java类使用。我必须将

有一个应用程序使用带有通配符的类路径运行*

e、 g java-cp/opt/sampleapp/lib/*Main

它有较旧版本的joda time(1.8.),没有DateTime.now()方法,可从joda time的2.x版本获得。 注意:

这个joda时间(1.8)被打包到另一个jar(jruby-jar-1.6.8.jar)中 文件)

我正在编写一个测试应用程序,它使用的是JodaTime(2.x以上)版本,该版本具有DateTime.now()方法&由我的java类使用。我必须将我的应用程序(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类打破了规则。我可以想到不同的方法,它们都有各自的缺点:

  • 使用没有问题的较新版本的jruby
  • 使用旧的jruby版本并对其进行操作:下载它,删除joda时间类,然后使用类似
    1.6.8-fixed
    的版本将其上载到maven存储库
  • 为测试应用程序设置joda time的其他版本的阴影

  • 谢谢@JF Meier。我已经验证了选项1,它工作正常。但我不能,因为它是从专有的,违反了许可证。对于方案2,也不可能,因为如上所述(方案1)。第三,我不确定这一点,但刚才我发现jar是我的测试应用程序jar的可传递依赖项。让我检查一下,shade插件是否可能,因为sampleapp是一个单独的正在运行的应用程序,我正在用maven jar插件创建一个jar来创建jar。?任何链接/参考都会非常有用。