我有一个现成的.jar文件,想知道是否可以提取和重命名包?
所以当我通常用启动.jar文件时
java -cp myFile.jar com.codehelper.demo.Main
我想将其中的"codehelper"重命名为不同的名称,以便我可以通过运行它
java -cp myFile.jar com.NEW_NAME.demo.Main
我试图反编译所有文件,用重命名的"codehelper"路径将其添加到文件夹结构中,然后再次编译,但没有成功。我还重命名了每个文件中包含的所有包,如
import com.codehelper...
那么我的目标是无法实现的,还是我可以做到这一点?如果有人能向我解释该怎么做,那就太好了。
谢谢你,很抱歉我糟糕的英语
edit:似乎我唯一不能编译的文件是一个包含这个switchcase的文件。
private int priotiryLevel(DiscoveryInfoBehave info)
{
int ret = 0;
switch (1.$SwitchMap$com$peerialism$natcracker$common$GatewayDevice$GatewayType[info.getNatDevice().getGatewayType().ordinal()])
{
case 1:
ret = 0;
break;
case 2:
ret = 4;
break;
case 3:
ret = 5;
break;
}
return ret;
}
我也试着重命名这个switch案例中的特定单词,但没有付出任何努力。
编写一个新的包装器类:
package com.NEW_NAME.demo;
public class Main
{
public static void main(String[] args)
{
com.codehelper.demo.Main.main(args);
}
}
编译它并将其添加到jar中。您现在可以将其调用为:
java -cp myFile.jar com.NEW_NAME.demo.Main
并且它将静默地分派到实际实现中。
这通常是不可能的。如果重命名一些文件,Java将无法找到它们(公共类名必须和文件名相同)。您可以使用main类重命名文件,并按照@Joe在回答中建议的方式进行调用。但如果你重命名其他东西,它就会停止工作。代码中可能存在这些类的cals。"codehelper"名称也是如此。您不能从代码中删除它。即使从一个文件中删除它,任何人都可以在代码的其他地方看到它。
重命名目录与重命名文件相同。您销毁了命名空间(包),代码将不再工作,因为在类内部,使用了此包。此外,代码中不需要导入,因为您可以从执行代码中直接调用com.package-name.class。通过重命名包,您将销毁此文件,程序将崩溃。它可能会运行一段时间,但一旦程序到达此调用,它就会崩溃。
所以这个
import com.codehelper...
在代码中不是强制性的,即使代码正在使用包也是如此。你可以直接写
com.codehelper.*** xy = new com.codehelper.***();
即使你重命名了代码中的所有内容,你仍然没有保证的功能。代码可能正在使用反射,并从sting代码创建类实例。例如:
Java如何从字符串实例化类
行下评论:
做一些反编译->编译工作,似乎像是偷代码,如果你不愿意支付许可证,你想隐藏它。
再加上做这样的事情,这总是一种糟糕的做法。我看不出这有什么真正的用处。