代码之家  ›  专栏  ›  技术社区  ›  Chathuranga Chandrasekara

从JAR文件导入安全类

  •  1
  • Chathuranga Chandrasekara  · 技术社区  · 15 年前

    考虑一个java程序从jar文件导入类的场景。如果同一个类驻留在两个或多个jar文件中,则可能会出现问题。

    1. 在这种情况下,程序导入的类是什么?是上课吗 使用较旧的时间戳??

    2. 我们可以遵循哪些实践来避免此类复杂情况。

    编辑:这是一个例子。我有两个jar文件my1.jar和my2.jar。这两个文件都包含com.mycompany.CrazyWriter

    6 回复  |  直到 15 年前
        1
  •  0
  •   Paul Wagland    15 年前

    罐子 文件夹。。。

    1. 不要将同一个类放入多个jar文件中,或者如果您试图覆盖系统类,请使用 -bootclasspath .

    编辑 sealing the jar

        2
  •  2
  •   Robert Christie    15 年前

    默认情况下,类由 ClassLoader

    如果同一个类有两个实现,则将加载类装入器首先找到的实现。

    如果这些类实际上不是同一个类(相同的名称但不同的方法),那么在尝试使用它时会出现异常。

    通过使用多个类加载器,可以在单个VM中加载两个名称相同的类。这个 OSGI 框架可以为您管理许多复杂的问题,确保加载了正确的版本,等等。

        3
  •  0
  •   phisch    15 年前

    类加载器负责加载类。 如果在类路径上有两次相同的Jar,或者如果有两个Jar包含同一类的两个不同版本(即com.packagename.Classname),则会加载第一个找到的Jar。

    尽量避免在类路径上使用同一个jar两次。

        4
  •  0
  •   user85421    15 年前
    1. 不知道你说的是什么意思“ 同一类驻留在另外两个类中 "

      如果您指的是内部/嵌套类,那么应该没有问题,因为它们位于不同的名称空间中。

    2. 如何避免?
      一个包应该只在一个JAR中,以避免重复的类。如果两个类具有相同的简单名称,如 java.util.Date java.sql.Date ,但是在不同的包中,它们实际上是不同的类。您必须使用完全限定名(至少与其中一个类不同)来区分它们。

        5
  •  0
  •   James B    15 年前

    如果您在确定正在使用的类的哪个版本时遇到问题,那么jwhich可能有用: http://www.fullspan.com/proj/jwhich/index.html

        6
  •  0
  •   Pascal Thivent    15 年前

    如果同一个类驻留在另外两个jar中,则应该存在问题。

    你到底是什么意思?为什么? 应该 这会是个问题吗?

    在这种情况下,程序导入的类是什么(使用较旧的时间戳初始化??)

    Setting the class path (引用部分也适用于存档文件):

    指定多个类路径项的顺序很重要。Java解释器将在目录中查找类 按它们出现的顺序排列 C:\java\MyClasses . 只有在该目录中找不到具有正确名称的类时,解释器才会在 C:\java\OtherClasses 目录

    换句话说,如果需要特定的顺序,那么只需在类路径中显式地枚举JAR文件。这是应用服务器供应商常用的东西:要修补产品的特定类,您需要放置一个JAR(例如。 CR1234.jar )在主JAR之前的类路径上包含修补类(例如 weblogic.jar

    我们可以遵循哪些实践来避免此类复杂情况。

    推荐文章