code: public static PluginProperties fromJarFile(final String filename) {
          final Properties properties = new Properties();
          try {
              final JarFile jarFile = new JarFile(requireNonNull(filename));
              final Optional<String> propertiesPath = getPropertiesPath(jarFile);
  
              if (propertiesPath.isPresent()) {
                  LOG.debug("Loading <{}> from <{}>", propertiesPath.get(), filename);
                  final ZipEntry entry = jarFile.getEntry(propertiesPath.get());
  
                  if (entry != null) {
                      properties.load(jarFile.getInputStream(entry));
                  } else {
                      LOG.debug("Plugin properties <{}> are missing in <{}>", propertiesPath.get(), filename);
                  }
              }
          } catch (Exception e) {
              LOG.debug("Unable to load properties from plugin <{}>", filename, e);
          }
  
          return new PluginProperties(properties);
      }
docs: Loads the Graylog plugin properties file from the given JAR file.
  
  The path to the properties file resource inside the JAR file is stored in the "Graylog-Plugin-Properties-Path"
  attribute of the JAR manifest. (Example: {@code org.graylog.plugins.graylog-plugin-map-widget})
  
  If the plugin properties file does not exist or cannot be found (like in older plugins) a default
  {@link PluginProperties} object will be returned.
  
  @param filename path to the JAR file
  @return the plugin properties object