Как прочитать manifest.mf из класса POJO (не сервлета), созданного в Spring? - PullRequest
3 голосов
/ 11 октября 2010

У меня есть простой сервис под названием BuildNumberService, который будет создан весной.

Я пытаюсь найти самый чистый код для класса, чтобы найти файл MANIFEST.MF из файла jar, в который он был упакован.

Код должен выполняться внутри контейнера сервлета.

@Service
public class BuildNumberService {

    private static final String IMPLEMENTATION_BUILD = "Implementation-Build";

    private String version = null;

    public BuildNumberService() {

      // find correct manifest.mf
      // ?????


      // then read IMPLEMENTATION_BUILD attributes and caches it.
       Attributes mainAttributes = mf.getMainAttributes();
       version = mainAttributes.getValue(IMPLEMENTATION_BUILD);
    }

    public String getVersion() {
        return this.version;
    }
}

Как бы ты это сделал?

Редактировать: На самом деле я пытаюсь найти ресурс по имени, который находится в том же пакете, что и реальный класс.

Ответы [ 3 ]

2 голосов
/ 06 сентября 2014

Я нашел другое решение для загрузки MANIFEST.MF без ссылки на контекст сервлета, просто используя Spring Framework.

Я использовал эту конфигурацию с Spring 3.1.2.RELEASE, но я считаю, что она должна работать нормальнов более поздних выпусках.

Сначала напишите следующий bean-компонент в вашем applicationContext.xml

<bean class="java.util.jar.Manifest" id="manifest">
    <constructor-arg>
        <value>/META-INF/MANIFEST.MF</value>
    </constructor-arg>  
</bean>

Вы должны заметить, что аргумент конструктора из класса Manifest принимает InputStream какпараметр, однако, вам не нужно беспокоиться об этом, потому что Spring преобразует предоставленное значение в соответствие с аргументами конструктора.Более того, начиная путь с косой черты / (/ META-INF / ...), Spring ищет этот файл в объекте контекста сервлета, тогда как, начиная с префикса classpath:, он направляет Spring для поиска пути к классам, чтобы найтизапрашиваемый ресурс.

Во-вторых, объявите вышеупомянутый компонент в вашем классе:

@Autowired
@Qualifier("manifest")
private Manifest manifest;

Мой MANIFEST.MF находится в папке $ WEBAPP_ROOT / META-INF /и я успешно протестировал это решение на Apache Tomcat 7 и WildFly 8.

2 голосов
/ 11 октября 2010

Хорошо, если вы знаете, что jar находится в файловой системе (например, не во время войны), и вы также знаете, что менеджер безопасности дает вам разрешение на доступ к домену защиты класса, вы можете сделать это следующим образом: *

public static InputStream findManifest(final Class<?> clazz) throws IOException,
    URISyntaxException{
    final URL jarUrl =
        clazz.getProtectionDomain().getCodeSource().getLocation();
    final JarFile jf = new JarFile(new File(jarUrl.toURI()));
    final ZipEntry entry = jf.getEntry("META-INF/MANIFEST.MF");
    return entry == null ? null : jf.getInputStream(entry);
}
0 голосов
/ 01 мая 2019
Manifest mf = new Manifest();
Resource resource = new ClassPathResource("META-INF/MANIFEST.MF");
                    InputStream is= resource.getInputStream();
                        mf.read(is);
                        if (mf != null) {
                            Attributes atts = mf.getMainAttributes();
                            implementationTitle = atts.getValue("Implementation-Title");
                        }
...