我可以重命名现有jar包的包路径吗



我有一个现成的.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如何从字符串实例化类


行下评论:

做一些反编译->编译工作,似乎像是偷代码,如果你不愿意支付许可证,你想隐藏它。

再加上做这样的事情,这总是一种糟糕的做法。我看不出这有什么真正的用处。

最新更新