Показать контент MANIFEST на веб-странице [дубликат]

Я нашел способ, если вы проходите через классы и хотите, чтобы класс принадлежал методу AND. Это требует немного работы по извлечению, но это делает ее точкой. Это работает в Python 2.7.13.

  import inspect, os class ClassOne: def method1 (self): classtwoObj.method2 () class ClassTwo: def method2 (self): curframe = inspect.currentframe  () calframe = inspect.getouterframes (curframe, 4) print '\nI был вызван из', calframe [1] [3], \ 'in', calframe [1] [4] [0] [6: -2]  # создавать объекты для доступа к классам classoneObj = ClassOne () classtwoObj = ClassTwo () # запустить программу os.system ('cls') classoneObj.method1 ()  
45
задан Buhake Sindi 5 September 2012 в 11:04
поделиться

7 ответов

Не знаете о «официальном» способе его чтения, но если MANIFEST.MF не может быть правильно загружен в качестве ресурса, как насчет того, чтобы попытаться получить свой путь от «ServletContext.getRealPath ()» на какой-либо веб-путь, определенный в вашем приложении?

Написание версии приложения также в другое место (файл свойств в WEB-INF / classes) муравей во время сборки - другое решение, которое приходит мне на ум.

1
ответ дан david a. 16 August 2018 в 00:03
поделиться

немного поздно, но это работает для меня (веб-приложение в Glassfish)

Properties prop = new Properties();
prop.load(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF"));
System.out.println("All attributes:" + prop.stringPropertyNames());
System.out.println(prop.getProperty("{whatever attribute you want}"));
10
ответ дан javadude 16 August 2018 в 00:03
поделиться
  • 1
    обратите внимание: после RFC-822 вы найдете проблемы с использованием Properties, так как длинные значения разбиваются на большее количество строк. Пользовательский класс Manifest. – Francisco Spaeth 11 April 2013 в 08:27

Возможно, ваши побочные эффекты проистекают из того факта, что почти все банки включают MANIFEST.MF, и вы не получаете правильного. Чтобы прочитать MANIFEST.MF из webapp, я бы сказал:

ServletContext application = getServletConfig().getServletContext();
InputStream inputStream = application.getResourceAsStream("/META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(inputStream);

Обратите внимание, что запуск Tomcat из Eclipse не совпадает с запуском Tomcat, поскольку Eclipse играет с загрузчиком классов.

86
ответ дан Pascal Thivent 16 August 2018 в 00:03
поделиться
  • 1
    Действительно, военный манифест не будет на кладбище. – Tom Hawtin - tackline 5 March 2009 в 17:52
  • 2
    +1 для получения фактического кода, который действительно работает. – Bennett McElwee 9 December 2009 в 23:21
  • 3
    Это, безусловно, правильный ответ +1 – Adam Gent 20 November 2010 в 20:47
  • 4
    @PascalThivent Есть ли способ сделать это работает при запуске tomcat в eclipse? – CaiNiaoCoder 10 December 2014 в 09:59
  • 5
    Сладкое спасибо. Я расширил это в stackoverflow.com/q/37475810/1019307 относительно того, как попасть в @Service. – HankCa 27 May 2016 в 06:26

По умолчанию класс загрузчиков классов работает, чтобы отложить родительский процесс, прежде чем пытаться найти собственные ресурсы. Поэтому, если у загрузчика родительского класса есть доступный манифест, это то, что вы получите. На самом деле, серверы приложений не обязательно делают это, чтобы приложения могли переопределять версии библиотек. Кроме того, загрузчики классов могут иметь несколько банок и, следовательно, несколько манифестаций.

Возможно, он сможет получить URL-адрес ресурса одного из ваших уникально названных ресурсов. Откройте соединение. Настроить на JarURLConnection. Получите JarFile. Загрузите манифест из этого. Это может не сработать, особенно если Tomcat взрывает войну.

[Обновить] Конечно, сам файл войны не находится в пути к классам. У classpath будет что-то вроде WEB-INF / lib / ( .jar | .zip) и WEB-INF / classes /. Получение ресурса из ServletContext должно работать.

Лучшее решение: Сделайте что-то другое. :)

2
ответ дан Tom Hawtin - tackline 16 August 2018 в 00:03
поделиться

Правильный манифест существует в корне приложения на сервере. Выясните корень приложения, например, узнав путь к классу вашего класса:

String rootPath  = getClass().getProtectionDomain().getCodeSource().getLocation().getPath()

Затем замените путь выше указанным путем: пример Glassfish:

/applications/<webProject>/META-INF/MANIFEST.MF

It работа для меня.

2
ответ дан user3687374 16 August 2018 в 00:03
поделиться

Это то, что я делаю, чтобы печатать различные версии в файле журнала. Я жестко закодировал расширенный путь, но приложения могут использовать servletContext.getRealPath("/") для чтения полного пути к папке webapp. Может печатать только предоставленные библиотеки или все, что угодно из папки lib.

// print library versions (jersey-common.jar, jackson-core-2.6.1.jar)
try {
    List<String> jars  = Arrays.asList( "jersey-common", "jackson-core", "openjpa", "mylib" );
    StringBuilder verbuf = new StringBuilder();
    for(File file : new File("/opt/tomcat/webapps/myapp/WEB-INF/lib/").listFiles() ) {
        String name = file.getName();
        if (file.isDirectory() || !file.isFile() || !name.endsWith(".jar") ) continue;
        name = name.substring(0, name.length()-4);
        boolean found = jars.contains(name);
        if (!found) {
            int idx = name.lastIndexOf('-');
            if (idx>0)
                found = jars.contains( name.substring(0, idx) );
        }
        if (!found) continue;

        JarFile jarFile = new JarFile(file, false);
        try {
            String ver;
            Manifest mf = jarFile.getManifest();
            if (mf!=null) {
                ver = mf.getMainAttributes().getValue("Bundle-Version");
                if (ver==null || ver.isEmpty())
                    ver = mf.getMainAttributes().getValue("Implementation-Version");
            } else ver=null;
            if (verbuf.length()>0) verbuf.append(", ");
            verbuf.append(name + "=" + (ver!=null?ver:"") );                        
        } finally {
            jarFile.close();
        }
    }
    System.out.println( verbuf.toString() );
} catch(Exception ex) {
    ex.printStackTrace();
}
0
ответ дан Whome 16 August 2018 в 00:03
поделиться

Попробуйте использовать jcabi-manifestests , который делает всю эту загрузку для вас. Например:

String version = Manifests.read("My-Version");

загружает атрибут My-Version из одного из доступных файлов MANIFEST.MF.

Важно отметить, что (подробности здесь здесь ) в большинстве веб-контейнеров текущий загрузчик класса потока не совпадает с загрузчиком класса контекста сервлета. Вот почему вы должны добавить свой сервлет-контекст в регистр во время выполнения ( подробнее ):

Manifests.append(servletContext);

Также проверьте это: http: // www. yegor256.com/2014/07/03/how-to-read-manifest-mf.html

3
ответ дан yegor256 16 August 2018 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: