我想将一部分Java项目导出到一个jar文件中,同时只包含运行主类所必需的类文件。该项目包含具有相似但不相同的依赖项的其他主类。我可以运行自定义脚本来实现它,如下所示:
mkdir temp
cd temp
javac -sourcepath "../" -d . ../MAINCLASS_A.java
jar cmf MAINCLASS_A.manifest ../MAINCLASS_A.jar *
为了优雅并且更容易与他人分享,我想直接从Eclipse而不是这个自定义脚本运行它。但是,当我导出到JAR文件或Runnable JAR文件时,项目中的每个类文件都包含在内。我知道我可以设置手动过滤器来排除某些文件,但似乎应该有一个更聪明的选项。如何将Eclipse配置为仅包含主类实际依赖的类文件?
答案 0 :(得分:2)
我认为在一般情况下你想要做的事情是不可能的。是的,从理论上讲,javac可以找到(并找到)类之间的所有依赖关系。但只有在项目中对这些依赖项进行硬编码时才是正确的,即您不直接或间接使用任何动态类加载和反射。
真正的应用程序通常使用各种第三方库,框架等。因此,即使您从未在自己的代码Class.forName()
中说出,有时也会使用动态类加载。我认为如果你需要这种优化,你必须编写自定义脚本来构建自定义jar。 BTW你需要它的事实可能会给你一个提示,你的项目组织不正确。您应该将项目分成2个或更多。每个应该只包含其依赖项。在这种情况下,您可以使用内置的eclipse功能来打包jar文件。
答案 1 :(得分:0)
你做不到。直到运行时才会知道主类所依赖的所有类。
说,我们正在使用Class.forName("com.foo.Bar")
加载一个类。在这种情况下,主类中对com.foo.Bar
的唯一引用是字符串文字,javac
或jar
不会加载。
因此,您唯一的选择是设置手动过滤器,保存.jardesc
文件并将其用作脚本以便稍后创建类似的Jar文件。
这应该会让你有个先机。
http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-33.htm