# View help
java -jar "bin/jarjar-command-1.0.3.jar" --help
# Run the command
java -jar "jarjar-command-1.0.3.jar" --mode process --rules "rules.txt" target/my.jar --output target/my_new.jar
# View contents of resulting jar
jar tf target/my_new.jar |less
5条答案
按热度按时间nbysray51#
您需要更改源代码并重新编译,然后更改包-简单地将类文件移动到jar内部(或外部)并没有帮助。
因此,请您的老师给予您源代码(或将类放入合适的包中),或使用反编译器自己完成。
cbeh67ev2#
按照@Piyush指示,使用以下命令创建Jar文件。
jar -cvf *.* Example.jar
i7uq4tfw3#
如果您使用的是eclipse,只需将源文件解压缩到临时项目的源文件夹中。然后,创建一个新项目(您将处理的真实的项目),并在java/src目录下,创建所需的包结构。然后,只需将临时项目中的源文件拖放到真实的项目中的正确包中即可。Eclipse将负责为您更改每个类的包声明。
ikfrs5lh4#
要将jar中的类从根(未命名,默认)包移动到命名包(例如
org.example
):1.从源代码重建Jar
使用您的IDE,将这些类从root/unnamed/default包中移到一个正确命名的包中,然后再次构建jar。
简单地解压缩jar并移动类文件是没有帮助的-类文件必须在内部修改,这就是下面的工具所做的。
如果您无法访问源代码,或者您不想弄乱源代码,我从this相关讨论中找到了一些解决方案。
2. Jar Jar链接工具
https://github.com/shevek/jarjar
它很旧,但仍然工作。从here获取它,如这里所讨论的。
我使用它的方式
匹配根类的
rules.txt
是*
因此规则将它们移动到
com.example
包中。@1
表示匹配的对象。不幸的是,它似乎不适用于包含
$
字符的类名-参见this issue。3.使用Maven Shade插件工具
https://maven.apache.org/plugins/maven-shade-plugin/usage.html
这对我的案子更有效。将此片段添加到
<project>/<build>/<plugins>
标记内的pom.xml
中。为了匹配包根目录中的类,我使用了
<pattern></pattern>
,尽管可能有更好的方法。另外,为了方便使用,我的所有根类都以
TypeScriptParser*
或TypeScriptLexer*
开头,所以我显式地包含了它们。在正确的类上工作需要一些尝试和错误。在我的构建版本
mvn package
上运行这个命令,确实从我的项目中引入了我不需要的额外类,所以我不得不手动删除它们(通过使用jar解压缩/压缩)讨论
知道命名包中的java文件不能访问未命名根包中的类(无论它们是在你的项目中还是在jar中)对我来说并不明显,但最终向我解释了here。我想知道有多少Java开发人员被这个问题绊倒了。
nimxete25#
您可以手动解压缩它们,创建包并使用IDE或从命令提示符(如this)将它们重新打包。另外,请查看有关Jar和Unjar的ANT文档,该文档非常全面。