Тонкий (нер) автономный клиент для корпоративного приложения

Сначала небольшая предыстория:

Я работаю над корпоративным приложением (ear) с модулем EJB и модулем Application Client. Я также использую JPA в спящем режиме для постоянства и swingx для графического интерфейса. Это единственные сторонние банкоматы. Это приложение развернуто на Glassfish.

Все шло хорошо, пока я не развернул свое приложение в первый раз и не попытался запустить его с помощью Java Web Start. Я столкнулся с основными блокировщиками дорог - JWS не любит hibernate3.jar, жалуется, что он не подписан, хотя это так. Я описал проблему здесь, если вам интересно . В любом случае это может быть связано с этой неустраненной ошибкой в JVM. Есть и другие вещи, которые мне не нравятся в JWS, но сейчас это не имеет значения.

Текущие подходы

  • Учитывая эту проблему, я подумал, что разверну приложение сам (я планирую написать какой-нибудь автообновитель, чтобы все синхронизировалось). Поэтому я следовал инструкциям здесь и все было здорово, за исключением того факта, что контейнер приложения, который мне нужно развернуть на клиенте, составляет около 40 МБ!!!. Это слишком!

  • Итак, я сказал, что уберу контейнер приложения, создам автономный клиент, выполню поиск EJB через JNDI и включу только минимум.

И вот я застрял!

Это поиск JNDI, который я использую:

Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
prop.put("org.omg.CORBA.ORBInitialHost", "bogdan-pc");
prop.put("org.omg.CORBA.ORBInitialPort", "3700");
try {
  InitialContext ctx = new InitialContext(prop);

  DatabaseCacheEJBRemote service = (DatabaseCacheEJBRemote) ctx.lookup("ejbs.DatabaseCacheEJBRemote");
  System.out.println("count: " + service.getProductionCount());

} catch (NamingException ex) {
  Logger.getLogger(MyFrame.class.getName()).log(Level.SEVERE, null, ex);
}

1) Я думал, что если я включу appserv-rt.jar и javaee.jar, должно быть достаточно. Очевидно, мне нужны другие вещи от GF... Вопрос будет заключаться в том, какой минимум мне нужно развернуть на клиенте, чтобы поиск EJB работал?

2) Зачем мне включать все зависимости ejb-модуля (например, библиотеки hibernate)? Я нигде не использую в своих клиентских материалах спящий режим...

Спасибо, что прочитали этот длинный пост!

ИЗМЕНИТЬ:

Некоторые подробности о моем окружении:

  • Ява 1.6.0_21
  • GF 3.0.1
  • Windows (XP/2003/7)

person Bogdan    schedule 05.09.2010    source источник


Ответы (3)


Подумайте об использовании WebServices для подключения вашего настольного приложения к серверу приложений. В Java EE 6 это намного проще, потому что вы можете просто аннотировать какой-либо сеансовый компонент (не очень уверен в деталях), чтобы он стал веб-службой. Это «тонкое» решение, и соединения могут выполняться через http (s), поэтому стандартные порты 80/443 не должны блокироваться в частных или корпоративных сетях.

person Jan Wegner    schedule 14.09.2010
comment
Когда клиент не работает внутри контейнера Jave EE, это определенно лучший подход. Также см. связанное обсуждение: stackoverflow. ком/вопросы/3675661/ - person Mike Baranczak; 17.09.2010

Вы должны быть в состоянии избавиться от многих зависимостей, если вы разделите свой ejb на отдельные модули, т. е. JAR-файлы интерфейса и реализации.
IPL-и клиентские JAR-файлы должны зависеть от intf, и тогда клиент больше не должен иметь никакой зависимости от hibernate.
Я нашел maven очень полезным набором инструментов для разделения и управления зависимостями, и создание файлов jnlp, дескрипторов развертывания, подписание файлов jar и т. д.

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

Почему бы вам не рассмотреть интерфейс на основе браузера, такой как gwt или vaadin или jboss-seam или калитка, или грааль, или гобелен, или одно из многих других. Тогда вам не придется беспокоиться об установке правильной версии java на клиенте.

person crowne    schedule 14.09.2010

Это полный список клиентских банок для Glassfish 3:

auto-depends.jar
deployment-common.jar
glassfish-corba-internal-api.jar    
internal-api.jar
management-api.jar
bean-validator.jar
dol.jar
glassfish-corba-newtimer.jar        
javax.ejb.jar
orb-connector.jar
common-util.jar
ejb-container.jar
glassfish-corba-omgapi.jar      
javax.jms.jar
orb-iiop.jar
config-api.jar
ejb.security.jar
glassfish-corba-orb.jar
javax.resource.jar
security.jar
config-types.jar
glassfish-api.jar
glassfish-corba-orbgeneric.jar      
javax.servlet.jar
ssl-impl.jar
config.jar
glassfish-corba-asm.jar
glassfish-naming.jar
javax.transaction.jar
transaction-internal-api.jar
connectors-internal-api.jar     
glassfish-corba-codegen.jar     
gmbal.jar
jta.jar
container-common.jar
glassfish-corba-csiv2-idl.jar       
hk2-core.jar
kernel.jar
person ChristiaanP    schedule 13.04.2011
comment
какой у вас источник этого списка? чем это отличается от включения самой стеклянной рыбы в качестве библиотеки? - person Thufir; 13.09.2014