6

This may, and should be, a question that has been asked and answered many times over, but I just cant find the answer.

If I have a compiled application running on a server, can I compile the application on my local machine, and swap a class that I compiled on my local machine, with the one on the server?

In other words, can I replace a file that has been compiled and is on the server side, with a file almost identical that has been compiled, and is located, on my local machine?

Since the version on the server side has some hard-coded connections in other files, and I dont know all of the places, I would prefer to only swap the one file that I need, instead of doing a recompile for the application as a whole.

4

3 回答 3

6

您的问题的答案是肯定的,您可以替换一个类文件,但这有点复杂,因为您必须确保没有其他依赖项发生更改。

例如,如果您正在编译的类涉及更改其他类中使用的方法的方法签名,那么您也需要替换它们。只要不更改公共、受保护或默认方法的方法签名,就应该没问题。

附带说明一下,如果这是你经常做的事情,你会很快意识到为什么对象经常被传递给方法而不是单个参数。

public MyObject getObject(MyObject2 mySecondObject)

对比

public MyObject getObject(int a, int b, int c)

当您需要为传递给方法的对象添加新属性时,方法签名不会更改,但是当您在方法签名本身上添加或删除参数时,它会在所有依赖项上产生连锁反应,要求您编译和替换这些类文件。

最后要强调的一点是,值得注意的是,您对私有方法或私有变量甚至方法的定义所做的更改对其他类文件没有影响或影响。唯一重要的是您维护您的方法与其他类的约定,因为输入和输出始终采用和返回相同的数据类型。

这突出了实例变量封装的重要性以及这些依赖项如何对其他类隐藏。

于 2012-05-07T09:38:54.013 回答
2

是的,你可以做到。此外,由于热点,该类甚至会在运行时重新加载,因此您不必重新启动服务器。这在开发周期中非常有用。

但要小心替换一个单独的类。如果该类在您的环境中更改了对其他类的引用,则替换将在服务器上失败。

于 2012-05-07T09:37:40.143 回答
1

我假设您正在谈论“离线”替换(我的意思是您可以重新启动服务器)。

在这种情况下,以下解决方案可能是可行的:Java 使用类路径变量。在那里,您定义了一系列 jars/文件夹,您的进程将在其中查找文件。

因此,您可以执行以下操作:

  1. 创建您的新类(它应该具有相同的名称并位于同一个包中)并编译。
  2. 在服务器上创建您计划存储更新类的文件夹。

  3. 更新类路径变量(可能在应用程序的启动脚本中),使该文件夹出现其他类之前。

  4. 重新启动您的服务器。现在您的新课程将在旧课程之前解决并加载。

警告:这适用于“独立”应用程序,通常适用于那些不使用自定义类加载器的应用程序(例如,应用程序服务器就是这种情况)。

更复杂的解决方案可以基于定义您的类加载器,该类加载器将查看这样的文件夹(如我所描述的)并尝试从那里加载资源。

希望这可以帮助。

于 2012-05-07T09:38:49.343 回答