Eclipse Jar-in-Jar无法找到joda.time类

时间:2015-12-22 23:54:28

标签: java eclipse jar

Eclipse有3个可运行的JAR导出方法。其中一个在我的情况下不起作用。我想停止使用导出库子文件夹并切换到单个JAR的导出方法。

在所有情况下,我的调用都在脚本中,有一些脚本变量,例如$ MEMORYOPTIONS

java $MEMORYOPTIONS -enableassertions -classpath VARIOUS-SHOWN-BELOW topLevelDomain.domain.packageName.className $1 $2 $3

...首先

我已成功使用以下导出方法和类路径,如图所示。

export > runnable jar > extract required libraries

-classpath /home/user/workspace/project/project1.jar

我有理由不想使用这个单一的JAR。 (这是因为未打包的第三方软件包暴露了具有重复名称的文件,因此我收到了令人讨厌的警告。示例:名为License.txt的文件位于多个软件包中。)

...其次

如前所述,我也成功使用以下"库子文件夹"导出方法和类路径如图所示。

export > runnable jar > copy required libraries into a sub-folder

-classpath /home/user/workspace/project/project1.jar:/home/user/workspace/project/project1_lib/*

(编辑:事实证明,JAR有一个指向project1_lib子文件夹的清单,因此可以简化类路径以省略它。只需从类路径中删除冒号(:)分隔符之后的部分。)< / p>

...第三

我解释&#34;打包所需的库&#34;表示JAR-in-JAR导出。使用显示的类路径调用时,此导出将导致无法找到该类。

export > runnable jar > package required libraries

-classpath /home/user/workspace/project/project1.jar

错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: org/joda/time/ReadablePartial

如何让这种特殊类型的Eclipse导出工作?我已经卸载了Eclipse(Mars)并重新安装了。我也有 删除了org.joda.time包并将其添加回来。问题依然存在。

3 个答案:

答案 0 :(得分:1)

你考虑过创建一个超级罐吗?

使用 maven ,您只需添加以下插件定义并使用命令 mvn package

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<executions>
    <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>

            <filters>
                <filter>
                    <artifact>joda-time:joda-time</artifact>
                    <includes>
                        <include>**</include>
                    </includes>
                </filter>
                <filter>
                    <artifact>*:*</artifact>
                    <excludes>
                        <exclude>META-INF/*.SF</exclude>
                        <exclude>META-INF/*.DSA</exclude>
                        <exclude>META-INF/*.RSA</exclude>
                    </excludes>
                </filter>
            </filters>
        </configuration>
    </execution>
</executions>
</plugin>

希望这有帮助。

答案 1 :(得分:0)

您需要将您的类作为参数调用捆绑的JarRsrcLoader

java $MEMORYOPTIONS -enableassertions 
-classpath /home/user/workspace/project/project1.jar 
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
topLevelDomain.domain.packageName.className

但是,这不允许您将参数($1 $2 $3)传递给被调用的类。

答案 2 :(得分:-1)

您应该使用java -jar选项启动您的应用。像这样:

java $MEMORYOPTIONS -enableassertions -jar /path/to/project1.jar $1 $2 $3