Ресурсы jar-файла

savl

Lotus team
28.10.2011
2 136
105
#1
Добрый. Толком решения не нашел...
Ситуация такая, есть LS агент (шедуль), внутри себя запускает java-агент (action list selection) через ag.run()
Все бы хорошо, но выпадает вот такая ошибка.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Ошибка</div></div><div class="sp-body"><div class="sp-content">
Exception in thread "AgentThread: JavaAgent"
java.lang.NoClassDefFoundError: nu.xom.Verifier (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
at nu.xom.Element._setLocalName(Unknown Source)
at nu.xom.Element.<init>(Unknown Source)
at nu.xom.Element.<init>(Unknown Source)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
Caused by:
java.lang.RuntimeException: Broken XOM installation: could not load nu/xom/characters.dat
at nu.xom.Verifier.loadFlags(Unknown Source)
at nu.xom.Verifier.<clinit>(Unknown Source)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
... 6 more
Понимаю, что не может получить ресурс, вернее открыть в потоке. Потому что ресурс так таковой он находит, иначе была бы другая ошибка.
Более того, если из Designer сделать Run, все отрабатывает без ошибок.
Никто не сталкивался? Знаете как решить?
Я подозреваю две вещи:
1. Доп. настройки надо сделать.
2. XOM-код переписать именно этот кусок.
 

savl

Lotus team
28.10.2011
2 136
105
#3
на серванте, в папке ...\lib\ext
В notes.ini прописаны пути, да и пакет он видит
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#4
Ситуация такая, есть LS агент (шедуль), внутри себя запускает java-агент (action list selection) через ag.run()
Не в тему: ситуация конечно специфическая с обработкой больших файлов... но в других случаях я не вижу смысла из агента, крутящегося на сервере, запускать ещё один с помощью Run, runWithDocumentContext(ndParam) гораздо лучше.
Для этого случая я бы тоже попробовал.
 

savl

Lotus team
28.10.2011
2 136
105
#5
Не вариант, да и контекста нет. Вопрос почему не может получить файл ресурса...
 

garrick

Lotus team
26.10.2009
901
61
#6
На какой-нибудь Permission в стек-трейсе не ругается? Попробуйте в java.policy в секции grant прописать permission java.security.AllPermission
 

savl

Lotus team
28.10.2011
2 136
105
#7
Прописано по умолчанию. И да, не ругается. Ищу дальше.
 

savl

Lotus team
28.10.2011
2 136
105
#9
да, в самой секции grant такого не было, сейчас прописал, понаблюдаем...
Все равно как-то странно, policy такая же как у меня на клиенте, ничем не отличается, разве что это строчкой теперь.
 

savl

Lotus team
28.10.2011
2 136
105
#10
О, как... XML создан, теперь проблема вот в этом:
Exception in thread "AgentThread: JavaAgent"
error message: java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory
error message: at com.zehon.FileTransferClient.<clinit>(FileTransferClient.java:50)
error message: at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)

Caused by:
error message: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:77)
at java.net.URLClassLoader.findClass(URLClassLoader.java:383)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:269)
at java.lang.ClassLoader.loadClass(ClassLoader.java:652)
at java.lang.ClassLoader.loadClass(ClassLoader.java:618)


Я так понял, что он нашел org.apache.commons.logging.LogFactory, но на клиенте работало...
Если я правильно понял, то мне надо найти этот класс в jar и подключит на сервере, да?
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#11
Если доки нет, то да, - ругается на недостачу класса, - добросил пакет, пробуем, опять недостача? - опять добрасываем...
 

garrick

Lotus team
26.10.2009
901
61
#12
Я так понял, что он нашел org.apache.commons.logging.LogFactory, но на клиенте работало...
Если я правильно понял, то мне надо найти этот класс в jar и подключит на сервере, да?
Это он хочет Appache Commons Logging
Потом он ещё чего-нибудь попросит - ну, так и добавляй потихоньку, пока не угомонится.
 

savl

Lotus team
28.10.2011
2 136
105
#13
Угу, так и подумал, все еще учусь читать стеки...
 

savl

Lotus team
28.10.2011
2 136
105
#14
Спасибо всем, передача удалась.
Еще только один вопрос, в логе было вот такое сообщение:
error message: 13.12.2012 12:41:07 org.apache.commons.vfs.VfsLog info
INFO: Using "C:\WINDOWS\TEMP\vfs_cache" as temporary files store.
На передачу файлов это не повлияло, но стало интересно критично ли данное сообщение?
 

garrick

Lotus team
26.10.2009
901
61
#15
Ключевое слово INFO:. Это Apache Commons Logging "улучшенные" логи пишет. Оно как-то должно настраиваться писать ли всё подряд или только ошибки.
 

savl

Lotus team
28.10.2011
2 136
105
#17
ммм, все прекрасно работало, но началась проблема:
com.zehon.exception.FileTransferException: org.apache.commons.vfs.FileSystemException: Unknown scheme "sftp" in URI
Понимаю, что возможно ошибка в пакете, из-за инициализации схемы.
Но в тоже время если сервер перезагрузить, то следующий запуск проходит без ошибки.
Предположение: LN-JVM "держит" в памяти экземпляр или контейнер java кода (не знаю как назвать все это) и не выгружает правильно.
Или я чего-то не дописал... Агент запускается раз в неделю, за ним почти не следим.
Ребутить серв раз в неделю - тупо не хочется, да и не правильно это. Может кто подскажет?
В коде ничего такого нет, так что выкладываю. Данный агент вызывается через LS агента, через Run. Может в этом дело?
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ResourceBundle;
import java.util.Vector;

import lotus.domino.*;
import nu.xom.Attribute;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;

import com.zehon.FileTransferStatus;
import com.zehon.exception.FileTransferException;
import com.zehon.sftp.SFTPClient;

public class JavaAgent extends AgentBase {

public String tempdir()
{
String tempdir = System.getProperty("java.io.tmpdir");
if ( !(tempdir.endsWith("/") || tempdir.endsWith("\\")) )
tempdir = tempdir + System.getProperty("file.separator");
return tempdir;
}

public void NotesMain() {

try
{
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)
boolean debug = false;
if (debug) System.out.println("Start");

ResourceBundle settingsRes = ResourceBundle.getBundle("Sett");
String ExportFileName = settingsRes.getString("ExportFile");
String[] srvList = settingsRes.getString("ServerList").split(",");

File exportFile = new File(tempdir() + ExportFileName);
boolean flag = false;

// db = null;
View vw = null;
lotus.domino.Document doc = null;
lotus.domino.Document tmpdoc = null;
long cnt = 0;
Element expRoot = new Element("ContactList");

for(int i=0; i<srvList.length;i++)
{
if (debug) System.out.println(srvList);
Database db = session.getDatabase(srvList.toString(), "names.nsf", false);//session.getCurrentDatabase();

if (db != null && db.isOpen())
{
if (debug) System.out.println(db.getTitle());
vw = db.getView("EmailUser");

if (vw.getEntryCount() > 0)
{
doc = vw.getFirstDocument();
while (doc != null)
{
//if (debug) System.out.println(doc.getFirstItem("MailFile").getValues().elementAt(0).toString());
if (doc.getItemValueString("FirstName").length() != 0)
{
if (debug) System.out.println(doc.getItemValueString("FirstName"));
Element child = new Element("Contact");

Element tag = new Element("DisplayName");
lotus.domino.Item docfields = doc.getFirstItem("FullName");
Vector values = docfields.getValues();
docfields.recycle();
tag.appendChild(values.get(values.size()-1).toString());
child.appendChild(tag);

tag = new Element("LastName");
tag.appendChild(doc.getItemValueString("LastName"));
child.appendChild(tag);

tag = new Element("GivenName");
tag.appendChild(doc.getItemValueString("FirstName"));
child.appendChild(tag);

tag = new Element("Company");
tag.appendChild(doc.getItemValueString("CompanyName"));
child.appendChild(tag);

tag = new Element("SMTPAddress");
tag.appendChild(doc.getItemValueString("InternetAddress"));
child.appendChild(tag);
expRoot.appendChild(child);
flag = true;
++cnt;
if (debug) System.out.println("98");
}
if (debug) System.out.println("100");
tmpdoc = vw.getNextDocument(doc);
doc.recycle();
doc = tmpdoc;
if (debug) System.out.println("104");
}
}
}
vw.recycle();
db.recycle();
if (doc != null) doc.recycle();
if (tmpdoc != null) tmpdoc.recycle();
}

if (flag)
{
Attribute count = new Attribute("Count",String.valueOf(cnt));
expRoot.addAttribute(count);

FileOutputStream ExportFile = new FileOutputStream(exportFile.getAbsoluteFile());
Document expDoc = new Document(expRoot);
try
{
Serializer serializer = new Serializer(ExportFile, "ISO-8859-1");
serializer.setIndent(4);
serializer.setMaxLength(64);
serializer.write(expDoc);
ExportFile.close();
}
catch (IOException ioEx)
{
ioEx.printStackTrace();
}
}

String host = settingsRes.getString("host");
String username = settingsRes.getString("username");
String password = settingsRes.getString("password");
String sftpFolder = settingsRes.getString("sftpFolder");
String writeToLocalFolder = tempdir();
String ImportFile = settingsRes.getString("ImportFile");

SFTPClient SFTPObj = new SFTPClient(host, username,password);
if (flag)
{
try
{
int status = SFTPObj.sendFile(tempdir() + ExportFileName, sftpFolder); //SFTPObj.getFile(ExportFile, "/", writeToLocalFolder);
if(FileTransferStatus.SUCCESS == status){
if (debug) System.out.println("Send");
}
else if(FileTransferStatus.FAILURE == status){
if (debug) System.out.println("Can not sent sftp");
}
}
catch(FileTransferException ex){
ex.getCause().printStackTrace();
}
}

try
{
int status = SFTPObj.getFile(ImportFile, sftpFolder, writeToLocalFolder);
if(FileTransferStatus.SUCCESS == status){
if (debug) System.out.println("Copy to " + writeToLocalFolder);
}
else if(FileTransferStatus.FAILURE == status)
{
if (debug) System.out.println("Can not copy from sftp");
}
}
catch(FileTransferException ex)
{
ex.getCause().printStackTrace();
}
SFTPClient.closeCache();

if (debug) System.out.println("Done");
agentContext.recycle();
session.recycle();
System.gc();

} catch(Exception e) {
e.getCause().printStackTrace();
}
}
}[/CODE]
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#18
Предположение: LN-JVM "держит" в памяти экземпляр или контейнер java кода (не знаю как назвать все это) и не выгружает правильно.
то что лежит в lib/ext и не должно выгружаться...
я не понял насчет существования ResourceBundle settingsRes - оно вам для чего?
так понимаю - управляете через настройки..., дык почемубы не хранить настройки в доке нотусов?!
 

savl

Lotus team
28.10.2011
2 136
105
#19
да, настройки через файл Settings в агенте.
Хранить в доке не хочется, даже профайл не хочется. Вот такая прихоть.
Если понадобиться другую адресную книгу синхронизировать, то просто перекинем агента, а в нем все есть.
Да, минус если измениться пароль и логин или адрес, но ничего сильно страшного.
как все же сделать успешным - второй запуск?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#20
вот с этим объектом и морочтесь - как его дестроить ;)