java 从默认包更改JAR的包

jogvjijk  于 2023-05-27  发布在  Java
关注(0)|答案(5)|浏览(157)

我从老师的网站上下载了一个JAR文件,其中包含一些默认包中的类,因此我无法从已定义的包中访问它们。
我读到过更好的解决方案是重新打包JAR,更改包名。但是我不知道该怎么做。解决方案可能涉及使用Ant或Jar Jar,但我对这两种工具都没有经验。如果有人能给我指个方向我会很高兴的。
谢谢。

nbysray5

nbysray51#

您需要更改源代码并重新编译,然后更改包-简单地将类文件移动到jar内部(或外部)并没有帮助。
因此,请您的老师给予您源代码(或将类放入合适的包中),或使用反编译器自己完成。

cbeh67ev

cbeh67ev2#

按照@Piyush指示,使用以下命令创建Jar文件。
jar -cvf *.* Example.jar

i7uq4tfw

i7uq4tfw3#

如果您使用的是eclipse,只需将源文件解压缩到临时项目的源文件夹中。然后,创建一个新项目(您将处理的真实的项目),并在java/src目录下,创建所需的包结构。然后,只需将临时项目中的源文件拖放到真实的项目中的正确包中即可。Eclipse将负责为您更改每个类的包声明。

ikfrs5lh

ikfrs5lh4#

要将jar中的类从根(未命名,默认)包移动到命名包(例如org.example):

1.从源代码重建Jar

使用您的IDE,将这些类从root/unnamed/default包中移到一个正确命名的包中,然后再次构建jar。
简单地解压缩jar并移动类文件是没有帮助的-类文件必须在内部修改,这就是下面的工具所做的。
如果您无法访问源代码,或者您不想弄乱源代码,我从this相关讨论中找到了一些解决方案。

2. Jar Jar链接工具

https://github.com/shevek/jarjar
它很旧,但仍然工作。从here获取它,如这里所讨论的。
我使用它的方式

# 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

匹配根类的rules.txt*

rule * com.example.@1

因此规则将它们移动到com.example包中。@1表示匹配的对象。
不幸的是,它似乎不适用于包含$字符的类名-参见this issue

3.使用Maven Shade插件工具

https://maven.apache.org/plugins/maven-shade-plugin/usage.html
这对我的案子更有效。将此片段添加到<project>/<build>/<plugins>标记内的pom.xml中。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <configuration>
        <relocations>
        <relocation>
            <pattern></pattern>
            <shadedPattern>org.example.</shadedPattern>
            <includes>
            <include>TypeScriptParser*</include>
            <include>TypeScriptLexer*</include>
            </includes>
        </relocation>
        </relocations>
    </configuration>
    <executions>
    <execution>
        <phase>package</phase>
        <goals>
        <goal>shade</goal>
        </goals>
    </execution>
    </executions>
</plugin>

为了匹配包根目录中的类,我使用了<pattern></pattern>,尽管可能有更好的方法。
另外,为了方便使用,我的所有根类都以TypeScriptParser*TypeScriptLexer*开头,所以我显式地包含了它们。在正确的类上工作需要一些尝试和错误。
在我的构建版本mvn package上运行这个命令,确实从我的项目中引入了我不需要的额外类,所以我不得不手动删除它们(通过使用jar解压缩/压缩)

讨论

知道命名包中的java文件不能访问未命名根包中的类(无论它们是在你的项目中还是在jar中)对我来说并不明显,但最终向我解释了here。我想知道有多少Java开发人员被这个问题绊倒了。

nimxete2

nimxete25#

您可以手动解压缩它们,创建包并使用IDE或从命令提示符(如this)将它们重新打包。另外,请查看有关JarUnjar的ANT文档,该文档非常全面。

相关问题