Проблемы Classloader - Как определить, какие версии библиотеки (файлы банки) загружаются

Я бы предложил использовать Graphics.MeasureString .

Сначала вы создаете объект Graphics, затем вызываете MeasureString на нем, передавая строку и шрифт текстового поля .

Пример

string text = "TestingTesting\nTestingTesting\nTestingTesting\nTestingTesting\n";

// Create the graphics object.
using (Graphics g = textBox.CreateGraphics()) {        
    // Set the control's size to the string's size.
    textBox.Size = g.MeasureString(text, textBox.Font).ToSize(); 
    textBox.Text = text;
}

Вы также можете ограничить его вертикальной осью, установив только свойство textBox.Size.Height и используя перегрузку MeasureString, которая также принимает int width.

Редактировать

Как указал Слэкс, другая опция использует TextRenderer.MeasureString . Таким образом, нет необходимости создавать объект Graphics.

textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize(); 

Здесь вы можете ограничить вертикальное изменение размера с помощью техники Ганса, передав дополнительный параметр Size в MeasureString с int.MaxValue высота.

27
задан Johan Pelgrim 21 November 2008 в 09:35
поделиться

5 ответов

Если Вы, оказывается, используете JBoss, существует MBean (репозиторий загрузчика класса iirc), где можно попросить все classloaders, которые загрузили определенный класс.

, Если все остальное перестало работать, всегда существуют '-verbose:class' Java, которые распечатают местоположение банки для каждого файла класса, который загружается.

19
ответ дан Tom 14 October 2019 в 14:48
поделиться

В текущей версии Java управление версиями библиотеки является довольно покрытым шерстью термином, который полагается на JAR, упаковываемый правильно с полезной декларацией. Даже тогда это - большая работа для запущенного приложения для сбора этой информации вместе полезным способом. Время выполнения JVM не дает Вам справки вообще.

я думаю, что Ваш лучший выбор состоит в том, чтобы осуществить это во время изготовления, с помощью инструментов управления зависимости как Ivy или Maven для выборки правильных версий всего.

Интересно, Java 7 будет, вероятно, включать надлежащую платформу управления версиями модуля для точно этого вида вещи. Не то, чтобы это помогает Вам прямо в данный момент,

3
ответ дан skaffman 14 October 2019 в 14:48
поделиться

Если у Вас есть соответствующая информация о версиях в декларации банки, существуют методы, чтобы получить и протестировать версию. Никакая потребность вручную прочитать декларацию.

java.lang. Пакет .getImplementationVersion () и getSpecificationVersion () и isCompatibleWith () кажутся, что сделали бы то, что Вы ищете.

можно получить Пакет с this.getClass () .getPackage () среди других путей.

javadoc для java.lang. Пакет не дает определенные явные названия атрибута для этих атрибутов. Быстрый поиск Google поднял его в http://java.sun.com/docs/books/tutorial/deployment/jar/packageman.html

6
ответ дан John M 14 October 2019 в 14:48
поделиться

Я не думаю, что существует хороший способ проверить это. И я не уверен, что Вы хотите сделать это. То, что необходимо сделать, знакомятся с архитектурой загрузки класса сервера приложений и понимают, как это работает.

А упростил объяснение того, как это работает: EJB или веб-приложение будут сначала искать класс или ресурс в библиотеках, объявленных в его собственном модуле (ejb-банка или война). если класс не найден там, загрузчик класса передает запрос к своему загрузчику родительского класса, который является любой заявленной зависимостью (обычно ejb) или загрузчик класса приложений, который ответственен для загрузки библиотек и ресурсов, объявленных в пакете уха. Если класс или ресурс все еще не найдены, запрос передается к серверу приложений, который будет выглядеть в его собственном пути к классу.

Это сказанное, необходимо помнить, что модуль EE Java (веб-приложение, ejb) будет всегда загружать классы из банки, которая находится в самом близком объеме. Например, если Вы упакуете log4j v1 в военном файле, log4j v2 на уровне уха, и Вы помещаете log4j v3 в путь к классу своего сервера приложений, модуль будет использовать банку в своем собственном модуле. устраните это, и это будет использовать тот на уровне уха. выньте это, и это будет использовать тот в пути к классу сервера приложений. Вещи становятся более хитрыми, когда у Вас есть сложные зависимости между модулями.

Лучший должен поместить приложение глобальные библиотеки в уровень уха.

2
ответ дан Arjan Tijms 14 October 2019 в 14:48
поделиться

Должен быть лучший путь, чем способ, которым я делаю это, но я склонен делать это очень ручным способом.

  1. Каждая Банка должна иметь, это - номер версии в имени файла (если это не изменяется, это - имя).
  2. каждое приложение имеет свой собственный путь к классу.
  3. должна быть причина начать использовать обновленную Банку (новая версия). Только изменитесь, потому что это доступно, изменение, потому что это дает Вам функциональность, в которой Вы нуждаетесь.
  4. Каждый выпуск должен включать все Банки, которые необходимы.
  5. я сохраняю класс Версии, который знает список Банок, в которых он нуждается (это кодируется в исходный файл), и может быть проверен во времени выполнения против списка Банок в пути к классу.

, Поскольку я сказал, это является ручным, но это работает.

0
ответ дан Ron Tuffin 14 October 2019 в 14:48
поделиться
Другие вопросы по тегам:

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