code: @SuppressWarnings("deprecation")
      private static String getPhysicalPath(ArtifactEntry artifactEntry) {
          String physicalPath = artifactEntry.getPhysicalPath();
          if ( physicalPath != null ) {
              return physicalPath;
          }
  
          String entryPath = artifactEntry.getPath();
          String rootPath = artifactEntry.getRoot().getPhysicalPath();
          if ( rootPath != null ) {
              return rootPath + "!" + entryPath;
          }
  
          while ( (artifactEntry = artifactEntry.getRoot().getEntryInEnclosingContainer()) != null ) {
              String nextPhysicalPath = artifactEntry.getPhysicalPath();
              if ( nextPhysicalPath != null ) {
                  return nextPhysicalPath + "!" + entryPath;
              }
              entryPath = artifactEntry.getPath() + "!" + entryPath;
          }
  
          return entryPath;
      }
docs: Answer they physical path of an artifact entry.
  
  If the entry has a physical path (for example, because it was
  extracted), directly answer that path.  In that case, the path
  of the entry may be in a cache directory, and may not have a
  relationship to enclosing containers physical path.
  
  If the entry does not have a physical path, walk upwards until
  an enclosing container has a physical path, then append the
  path of enclosing entry which reaches the entry, placing "!"
  after each enclosing path.
  
  @param artifactEntry The entry for which to obtain a physical path.
  
  @return The physical path of the entry.