class JavaClass::Classpath::JarClasspath
Abstraction of a ZIP or JAR on the CLASSPATH. May return additional classpath elements for referenced libs. This is a leaf in the classpath tree.
- Author
-
Peter Kofler
Public Class Methods
Create a classpath with this jarfile .
JavaClass::Classpath::FileClasspath::new
# File lib/javaclass/classpath/jar_classpath.rb, line 33 def initialize(jarfile) super(jarfile) unless JarClasspath::valid_location?(jarfile) raise IOError, "jarfile #{jarfile} not found/no file" end @jarfile = jarfile init_classes @manifest = JavaClass::Gems::ZipFile.new(@jarfile).read('META-INF/MANIFEST.MF') setup_cache if JavaClass.unpack_jars? end
Check if the file is a valid location for a jar classpath.
# File lib/javaclass/classpath/jar_classpath.rb, line 28 def self.valid_location?(file) FileTest.exist?(file) && FileTest.file?(file) && FileTest.size(file) > 0 && file =~ /\.jar$|\.zip$/ end
Public Instance Methods
Return list of additional classpath elements defined in the manifest of this jarfile.
# File lib/javaclass/classpath/jar_classpath.rb, line 50 def additional_classpath if @manifest cp = @manifest.gsub(/\s{4,}/, ' ').scan(/^(.*): (.*)\s*$/).find { |p| p[0] == 'Class-Path' } if cp cp[1].strip.split.collect { |jar| File.join(File.dirname(@jarfile), jar) } else [] end else [] end end
Return the number of classes in this jar.
# File lib/javaclass/classpath/jar_classpath.rb, line 91 def count @class_names.size end
Return if classname is included in this jar.
# File lib/javaclass/classpath/jar_classpath.rb, line 73 def includes?(classname) @class_lookup[to_key(classname).file_name] end
Return true
as this classpath element is a jar. Zip
files return false
as well.
# File lib/javaclass/classpath/jar_classpath.rb, line 45 def jar? @manifest != nil end
Load the binary data of the file name or class name classname from this jar.
# File lib/javaclass/classpath/jar_classpath.rb, line 78 def load_binary(classname) key = to_key(classname) if JavaClass.unpack_jars? @delegate.load_binary(key) else unless includes?(key) raise ClassNotFoundError.new(key, @jarfile) end JavaClass::Gems::ZipFile.new(@jarfile).read(key).freeze end end
Return the list of class names found in this jar. An additional block is used as filter on class names.
# File lib/javaclass/classpath/jar_classpath.rb, line 64 def names(&filter) if block_given? @class_names.find_all { |n| filter.call(n) } else @class_names.dup end end
Private Instance Methods
Set up the class names.
# File lib/javaclass/classpath/jar_classpath.rb, line 109 def init_classes @class_names = list_classes. reject { |n| n =~ /package-info\.class$/ }. find_all { |n| valid_java_name?(n) }. sort. collect { |cl| JavaClassFileName.new(cl) } pairs = @class_names.map { |name| [name.file_name, 1] }.flatten @class_lookup = Hash[ *pairs ] # file_name (String) => anything end
Return the list of classnames (in fact file names) found in this jarfile.
# File lib/javaclass/classpath/jar_classpath.rb, line 98 def list_classes list = [] JavaClass::Gems::ZipFile.new(@jarfile).entries do |entry| name = entry.name next unless entry.file? and name =~ JavaLanguage::CLASS_REGEX # class file list << name end list end
Set up the temporary unpacking. This sets the delegate field for future use.
# File lib/javaclass/classpath/jar_classpath.rb, line 129 def setup_cache unpacker = TemporaryUnpacker.new(@jarfile) unpacker.create_temporary_folder unpacker.unpack! @delegate = FolderClasspath.new(unpacker.folder) end
# File lib/javaclass/classpath/jar_classpath.rb, line 119 def valid_java_name?(name) if JavaClassFileName.valid?(name) true else warn("skipping invalid class file name #{name} in classpath #{@jarfile}") false end end