Я нашел способ, если вы проходите через классы и хотите, чтобы класс принадлежал методу 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 ()
Не знаете о «официальном» способе его чтения, но если MANIFEST.MF не может быть правильно загружен в качестве ресурса, как насчет того, чтобы попытаться получить свой путь от «ServletContext.getRealPath ()» на какой-либо веб-путь, определенный в вашем приложении?
Написание версии приложения также в другое место (файл свойств в WEB-INF / classes) муравей во время сборки - другое решение, которое приходит мне на ум.
немного поздно, но это работает для меня (веб-приложение в 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}"));
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 играет с загрузчиком классов.
@Service
.
– HankCa
27 May 2016 в 06:26
По умолчанию класс загрузчиков классов работает, чтобы отложить родительский процесс, прежде чем пытаться найти собственные ресурсы. Поэтому, если у загрузчика родительского класса есть доступный манифест, это то, что вы получите. На самом деле, серверы приложений не обязательно делают это, чтобы приложения могли переопределять версии библиотек. Кроме того, загрузчики классов могут иметь несколько банок и, следовательно, несколько манифестаций.
Возможно, он сможет получить URL-адрес ресурса одного из ваших уникально названных ресурсов. Откройте соединение. Настроить на JarURLConnection
. Получите JarFile
. Загрузите манифест из этого. Это может не сработать, особенно если Tomcat взрывает войну.
[Обновить] Конечно, сам файл войны не находится в пути к классам. У classpath будет что-то вроде WEB-INF / lib / ( .jar | .zip) и WEB-INF / classes /. Получение ресурса из ServletContext
должно работать.
Лучшее решение: Сделайте что-то другое. :)
Правильный манифест существует в корне приложения на сервере. Выясните корень приложения, например, узнав путь к классу вашего класса:
String rootPath = getClass().getProtectionDomain().getCodeSource().getLocation().getPath()
Затем замените путь выше указанным путем: пример Glassfish:
/applications/<webProject>/META-INF/MANIFEST.MF
It работа для меня.
Это то, что я делаю, чтобы печатать различные версии в файле журнала. Я жестко закодировал расширенный путь, но приложения могут использовать 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();
}
Попробуйте использовать 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