erstellte Java Library unter Script Libraries findet Property File nicht

  • Hallo an alle,


    ich habe eine kleines Problem.
    Ich habe ein eigenes Java Package ausserhalb des Designer erstellt und in den Designer unter "Script Libraries" als Javalib importiert. Diese Java Package nutzt eine Properties File in der Einstellung für das Ausführen des Java-Package stehen.


    Diese Properties-File ist eine xml, die ich innerhalb der Javalib mit "Import -> Resource" eingebunden habe.


    Sofern ich meine Domino Applikation ausführe und auf das Java-Package zugreife, erhalte ich die Fehlermeldung, dass die Properties-File nicht gefunden worden ist.


    Was mach ich falsch?

  • Hi...


    Ähm? Du meinst innerhalb der Java-Klasse?


    und zwar mit


    Code
    new BufferedInputStream(new FileInputStream(FILEPATH))


    so funktioniert das mehr oder weniger auch...da ich die File irgendwo auf dem Server platzieren könnte, und den Pfad dann absolut angeben könnte.


    Nur was mach ich wenn sich die Datei innerhalb eines JAR-Archives befindet und der Pfad relativ angegeben ist?


    BTW: Ausserhalb des Designer läuft mein Java-Package problemlos!

  • Ich konnte mein Problem wohl noch nicht korrekt darstellen.


    Ich möchte Daten die in einer Dominodatenbank gespeichert sind teilweise nach MySQL auslagern.


    Dazu nutze ich die Java Persistence Api. Diese bringt zur Konfiguration eine persistence.xml mit. Den Pfad zu dieser persistence.xml kann ich leider nicht angeben/beeinflussen.


    Wenn ich in dem "normalen" eclipse alle Javaklassen erstellt habe und via Resources die xml hinzugefügt habe...läuft alles ohne Probleme.
    Da der Notes Designer ja auf Eclipse basiert, dachte ich mir das es da genau so "einfach" geht.
    Also was habe ich gemacht?


    "New Script Library... --> Java Libraray" JavaLib erstellt!


    "Import --> Java Source" damit habe ich alle Java Klassen importiert!


    "Import --> Archive" Alle benötigten JARS importiert.


    "Import --> Resource" Damit habe ich die persistence.xml importiert!


    Beim Ausführen meiner Applikation erhalte ich folgende Fehlermeldung in der Admin Console:


    "LS2J Error: Java constructor failed to execute"
    "javax.persistence.PersistenceException: No Persistence provider for EntityManager named PERSISTENCENAME"


    Demzufolge schließe ich daraus, dass er die xml nicht finden kann.

  • Und wie kommst du zu dem Schluss ?


    Für mich klingt die Fehlermeldung eher danach als ob irgendetwas mit der Config nicht stimmt oder ihm irgendeine berechtigung fehlt.


    Außerdem scheinst du das mit LS2J zu versuchen. Probier es doch erst mal als reine Java Umgebung

  • Naja


    Code
    javax.persistence.PersistenceException: No Persistence provider for EntityManager named PERSISTENCENAME


    sagt eigentlich aus das entweder was innerhalb der persistence.xml
    nicht stimmt oder die Datei garnicht erst gefunden wird. Ersteres kann ich eigentlich ausschließen, da wie bereits erwähnt, das Java Package außerhalb von Notes problemlos läuft.


    Code
    LS2J Error: Java constructor failed to execute


    Diese Fehlermeldung kommt, da der Klassenkonstruktor in meiner Java-Einstiegsklasse (die Schnittstelle zwischen LotusScript und Java) auf einen Fehler läuft, der wiederum durch die "fehlende/nicht auffindbare" persistence.xml verursacht wird.


    Was noch darauf hinweist, dass das Problem mit der xml zusammenhängt ist, dass ich ein zweites Java Package erstellt und integriert habe, was keine Konfigurationsfile braucht. Dieses Package läuft auch innerhalb Notes problemlos.


    Wie meinst du das mit reiner Java-Umgebung?
    Es besteht bereits eine komplette Notes Applikation und das Java Package ist eigentlich nur einen einzelnes Tool was ich in die Notes Applikation integrieren möchte. Also wie sonst, wenn nicht mit J2LS?

  • Wie ich schon mal zu Anfang sagte: Ohne den Code zu kennen ist es da mehr als schwer dir weiterzuhelfen. Und eine einzige Zeile als Ausschnitt bringt da auch nicht wirklich was..


    Und ich hab so meine Zweifel, daß du im Code den Aufruf tatsächlich mit dem Parameter PERSISTENCENAME machst.


    Und die Version von Java hast du auch beachtet, nicht daß du ein Package für eine andere Java Version verwendest als die die im Notes/Domino mitdrin ist. Das hat auch schon zu problemen geführt.


    Was ich meinte ist, das ganze mal direkt als Java Agent auszuführen, weil ich auch schon erlebt habe, daß über LS2J ausgeführter Java Code Probleme verursacht hat, die sonst nicht aufgetreten sind

  • Also antworten tust du ja fix. :)


    Also der relevante LotusScript Code:


    Code
    Private jSession As JavaSessionPrivate jError As JavaError 	Private WflClass As JavaClass 	Private wfl As JavaObject...Sub New (sServer As String, sFilePath As String)		On Error GoTo ErrorHandling		Dim sLocationInfo As String		sLocationInfo = CQSYS_DESIGNELEMENT & "CQWFL_Definition_Database.new"Set jSession = New JavaSessionSet WflClass = jSession.GetClass("lotus/wrapper/JavaLotusWrapper")Set wfl = WflClass.CreateObject()Exit Sub		ErrorHandling:		Set jError = jSession.getLastJavaError		Print Error		Print jError.ErrorMsg		Print jError.StackTrace	End Sub




    Der aufgerufende Konstruktor der Java-Einstiegsklasse:




    Natürlich rufe ich den EntityManager nicht mit PERSISTENCENAME auf...das war nur zu Veranschaulichung. Der Persistencename wurde von mir und auch anderen mehrmals überprüft. An dem liegt es also nicht.


    Beim Importieren meines Packages hatte der Designer mir mitgeteilt, dass das Package mit einer Version die höher als 1.5 erstellt wurde und wurde gefragt ob ich die Designerversion auf 1.5 umstellen möchte. Dies habe ich auch getan. Aber welche Version nun auf dem Server läuft, weiß ich jetz auf anhieb leider nicht genau. Kannst Du mir sagen wie ich das herusfinde?


    Ach so...als Java Agent...mmmhh...jut dem würde ich mich widmen wenn wir hier keine Lösung finden sollten. :)

  • Indem du die JVM im Domino per Kommandozeile aufrufst und dir die Version ausgeben lässt. Genau wie einem lokalen JDK/JRE auch.


    Und bei deinem Code ist auch wieder nur die Hälfte dabei.
    Mal davon abgesehen, daß auch der Packagename schon sehr unüblich ist.

  • Also die JVM-Version des Domino-Server ist 1.6.0


    Was ist den an dem Packagenamen ungewöhnlich?? Die heißen bei uns nunmal so... :-?


    Das einzige was jetzt evtl. noch releavant wäre sind die JPA Entity & controller Klassen:


    Code
    /** * * Controller Class for Entity WflProcess */public class WflProcessJpaController{    /**     * default Class Constructor     */    public WflProcessJpaController()    {        emf = Persistence.createEntityManagerFactory("XML_XSLTPU");    }    private EntityManagerFactory emf = null;    /**     *     * @return EntityManager     */    public EntityManager getEntityManager()    {        return emf.createEntityManager();    }    /**     * Write Object WflStyleSettings to Database     *     * @param wflProcess  Instance of Class WflProcess     */    public void create(WflProcess wflProcess)    {        EntityManager em = null;        try        {            em = getEntityManager();            em.getTransaction().begin();            em.persist(wflProcess);            em.getTransaction().commit();        } finally        {            if (em != null)            {                em.close();            }        }    }    /**     * Edit Record in Database     *     * @param wflProcess  Instance of Class WflProcess     * @throws NonexistentEntityException     * @throws Exception     */    public void edit(WflProcess wflProcess) throws NonexistentEntityException, Exception    {        EntityManager em = null;        try        {            em = getEntityManager();            em.getTransaction().begin();            wflProcess = em.merge(wflProcess);            em.getTransaction().commit();        } catch (Exception ex)        {            String msg = ex.getLocalizedMessage();            if (msg == null || msg.length() == 0)            {                Integer id = wflProcess.getWflId();                if (findWflProcess(id) == null)                {                    throw new NonexistentEntityException("The wflProcess with id " + id + " no longer exists.");                }            }            throw ex;        } finally        {            if (em != null)            {                em.close();            }        }    }    /**     * Delete Record in Database      *     * @param id  Primary Key in Database Table     * @throws NonexistentEntityException     */    public void destroy(Integer id) throws NonexistentEntityException    {        EntityManager em = null;        try        {            em = getEntityManager();            em.getTransaction().begin();            WflProcess wflProcess;            try            {                wflProcess = em.getReference(WflProcess.class, id);                wflProcess.getWflId();            } catch (EntityNotFoundException enfe)            {                throw new NonexistentEntityException("The wflProcess with id " + id + " no longer exists.", enfe);            }            em.remove(wflProcess);            em.getTransaction().commit();        } finally        {            if (em != null)            {                em.close();            }        }    }    /**     *     * @return List of WflStyleSetting Objects     */    public List<WflProcess> findWflProcessEntities()    {        return findWflProcessEntities(true, -1, -1);    }    /**     *     * @param maxResults  Maximum Results in List     * @param firstResult  Set first Result in List     * @return List of WflStyleSetting Objects     */    public List<WflProcess> findWflProcessEntities(int maxResults, int firstResult)    {        return findWflProcessEntities(false, maxResults, firstResult);    }    /**     * Is private Method     *     * @param maxResults  Maximum Results in List     * @param firstResult  Set first Result in List      * @return List of WflStyleSetting Objects     */    private List<WflProcess> findWflProcessEntities(boolean all, int maxResults, int firstResult)    {        EntityManager em = getEntityManager();        try        {            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();            cq.select(cq.from(WflProcess.class));            Query q = em.createQuery(cq);            if (!all)            {                q.setMaxResults(maxResults);                q.setFirstResult(firstResult);            }            return q.getResultList();        } finally        {            em.close();        }    }    /**     *     * @param id  Primary Key of sought record     * @return WflStyleSetting Object     */    public WflProcess findWflProcess(Integer id)    {        EntityManager em = getEntityManager();        try        {            return em.find(WflProcess.class, id);        } finally        {            em.close();        }    }    /**     *     * @return Number of Records in Database     */    public int getWflProcessCount()    {        EntityManager em = getEntityManager();        try        {            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();            Root<WflProcess> rt = cq.from(WflProcess.class);            cq.select(em.getCriteriaBuilder().count(rt));            Query q = em.createQuery(cq);            return ((Long) q.getSingleResult()).intValue();        } finally        {            em.close();        }    }}


    Die dazugehörige Entity:


    Code
    /** * * Entity Class for Database Table wfl_process */@Entity@Table(name = "wfl_process")@NamedQueries({    @NamedQuery(name = "WflProcess.findAll", query = "SELECT w FROM WflProcess w"),    @NamedQuery(name = "WflProcess.findAllActive", query = "SELECT w FROM WflProcess w WHERE w.wflStatus = 'Active'"),    @NamedQuery(name = "WflProcess.findByWflId", query = "SELECT w FROM WflProcess w WHERE w.wflId = :wflId"),    @NamedQuery(name = "WflProcess.findByWflProcessId", query = "SELECT w FROM WflProcess w WHERE w.wflProcessId = :wflProcessId"),    @NamedQuery(name = "WflProcess.findByWflProcessVersion", query = "SELECT w FROM WflProcess w WHERE w.wflProcessVersion = :wflProcessVersion"),    @NamedQuery(name = "WflProcess.findByWflTitle", query = "SELECT w FROM WflProcess w WHERE w.wflTitle = :wflTitle"),    @NamedQuery(name = "WflProcess.findByWflDescription", query = "SELECT w FROM WflProcess w WHERE w.wflDescription = :wflDescription"),    @NamedQuery(name = "WflProcess.findByWflAuthor", query = "SELECT w FROM WflProcess w WHERE w.wflAuthor = :wflAuthor"),    @NamedQuery(name = "WflProcess.findByWflDate", query = "SELECT w FROM WflProcess w WHERE w.wflDate = :wflDate"),    @NamedQuery(name = "WflProcess.findByWflChangeInfo", query = "SELECT w FROM WflProcess w WHERE w.wflChangeInfo = :wflChangeInfo"),    @NamedQuery(name = "WflProcess.findByWflRequestInfo", query = "SELECT w FROM WflProcess w WHERE w.wflRequestInfo = :wflRequestInfo"),    @NamedQuery(name = "WflProcess.findIdByWflTitle", query = "SELECT w.wflProcessId FROM WflProcess w WHERE w.wflTitle = :wflTitle"),    @NamedQuery(name = "WflProcess.findSystemById", query = "SELECT w.wflSystem FROM WflProcess w WHERE w.wflProcessId = :wflProcessId"),    @NamedQuery(name = "WflProcess.findVersionByWflProcessId", query = "SELECT w.wflProcessVersion FROM WflProcess w WHERE w.wflProcessId = :wflProcessId ORDER BY w.wflProcessVersion DESC"),    @NamedQuery(name = "WflProcess.findAllIds", query = "SELECT w.wflProcessId FROM WflProcess w  ORDER BY w.wflProcessId DESC")})public class WflProcess implements Serializable{    private static final long serialVersionUID = 1L;    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    @Basic(optional = false)    @Column(name = "wfl_id")    private Integer wflId;    @Basic(optional = false)    @Column(name = "wfl_system")    private String wflSystem;    @Basic(optional = false)    @Column(name = "wfl_process_id")    private String wflProcessId;    @Basic(optional = false)    @Column(name = "wfl_process_version")    private String wflProcessVersion;    @Basic(optional = false)    @Column(name = "wfl_title")    private String wflTitle;    @Basic(optional = false)    @Column(name = "wfl_description")    private String wflDescription;    @Basic(optional = false)    @Column(name = "wfl_author")    private String wflAuthor;    @Basic(optional = false)    @Column(name = "wfl_date")    @Temporal(TemporalType.TIMESTAMP)    private Date wflDate;    @Basic(optional = false)    @Column(name = "wfl_change_info")    private String wflChangeInfo;    @Basic(optional = false)    @Column(name = "wfl_request_info")    private String wflRequestInfo;    @Basic(optional = false)    @Column(name = "wfl_status")    private String wflStatus;    /**     * Default Class Constructor     */    public WflProcess()    {    }    /**     * Class Constructor with Primary Key Parameter     *     * @param wflId     */    public WflProcess(Integer wflId)    {        this.wflId = wflId;    }    /**     * Class Constructor with Parameters     *     * @param wflId  Primary Key     * @param wflSystem  System Name     * @param wflProcessId  Workflow ID     * @param wflProcessVersion  Workflow Version     * @param wflTitle  Workflow Name     * @param wflDescription  Workflow Description     * @param wflAuthor  Workflow Author     * @param wflDate  Workflow Create Date     * @param wflChangeInfo  Workflow Changes     * @param wflRequestInfo  Workflow Request Info     * @param wflStatus  Workflow Status --> active/freeze     */    public WflProcess(Integer wflId, String wflSystem, String wflProcessId, String wflProcessVersion, String wflTitle, String wflDescription, String wflAuthor, Date wflDate, String wflChangeInfo, String wflRequestInfo, String wflStatus)    {        this.wflId = wflId;        this.wflSystem = wflSystem;        this.wflProcessId = wflProcessId;        this.wflProcessVersion = wflProcessVersion;        this.wflTitle = wflTitle;        this.wflDescription = wflDescription;        this.wflAuthor = wflAuthor;        this.wflDate = wflDate;        this.wflChangeInfo = wflChangeInfo;        this.wflRequestInfo = wflRequestInfo;        this.wflStatus = wflStatus;    }    /**     *     * @return Primary Key     */    public Integer getWflId()    {        return wflId;    }    /**     *     * @param wflId     */    public void setWflId(Integer wflId)    {        this.wflId = wflId;    }    /**     *     * @return System Name     */    public String getWflSystem()    {        return wflSystem;    }    /**     *     * @param wflSystem     */    public void setWflSystem(String wflSystem)    {        this.wflSystem = wflSystem;    }    /**     *     * @return Workflow ID     */    public String getWflProcessId()    {        return wflProcessId;    }    /**     *     * @param wflProcessId     */    public void setWflProcessId(String wflProcessId)    {        this.wflProcessId = wflProcessId;    }    /**     *     * @return Workflow Version     */    public String getWflProcessVersion()    {        return wflProcessVersion;    }    /**     *     * @param wflProcessVersion     */    public void setWflProcessVersion(String wflProcessVersion)    {        this.wflProcessVersion = wflProcessVersion;    }    /**     *     * @return Workflow Name     */    public String getWflTitle()    {        return wflTitle;    }    /**     *     * @param wflTitle     */    public void setWflTitle(String wflTitle)    {        this.wflTitle = wflTitle;    }    /**     *     * @return Workflow Description     */    public String getWflDescription()    {        return wflDescription;    }    /**     *     * @param wflDescription     */    public void setWflDescription(String wflDescription)    {        this.wflDescription = wflDescription;    }    /**     *     * @return Workflow Author     */    public String getWflAuthor()    {        return wflAuthor;    }    /**     *     * @param wflAuthor     */    public void setWflAuthor(String wflAuthor)    {        this.wflAuthor = wflAuthor;    }    /**     *     * @return Workflow Create Date     */    public Date getWflDate()    {        return wflDate;    }    /**     *     * @param wflDate     */    public void setWflDate(Date wflDate)    {        this.wflDate = wflDate;    }    /**     *     * @return Workflow Change Info     */    public String getWflChangeInfo()    {        return wflChangeInfo;    }    /**     *     * @param wflChangeInfo     */    public void setWflChangeInfo(String wflChangeInfo)    {        this.wflChangeInfo = wflChangeInfo;    }    /**     *     * @return Workflow Request Info     */    public String getWflRequestInfo()    {        return wflRequestInfo;    }    /**     *     * @param wflRequestInfo     */    public void setWflRequestInfo(String wflRequestInfo)    {        this.wflRequestInfo = wflRequestInfo;    }    /**     * @return the wflStatus     */    public String getWflStatus()    {        return wflStatus;    }    /**     * @param wflStatus the wflStatus to set     */    public void setWflStatus(String wflStatus)    {        this.wflStatus = wflStatus;    }    @Override    public int hashCode()    {        int hash = 0;        hash += (wflId != null ? wflId.hashCode() : 0);        return hash;    }    @Override    public boolean equals(Object object)    {        // TODO: Warning - this method won't work in the case the id fields are not set        if (!(object instanceof WflProcess))        {            return false;        }        WflProcess other = (WflProcess) object;        if ((this.wflId == null && other.wflId != null) || (this.wflId != null && !this.wflId.equals(other.wflId)))        {            return false;        }        return true;    }


    Tiefere Einblicke kann ich leider nicht gewähren...da der Rest aus einer von mir importierten .jar kommt und ich zu diesen keine sourcen besitze.


    Die .jar's sind:


    Code
    eclipselink-2.0.2.jar
    eclipselink-javax.persistence-2.0.jar



    so...hab ich immernoch was vergessen??

  • Was mich daran wundert ist vor allem, daß ich nicht glaube, daß du bei lotus arbeitest.


    Und eigentlich starten Packagenamen immer mit dem Namen der Entwicklerfirma bzw der Entwickler-Internet Domain.


    Dein ursprünglich geschilderter Zugriff per Stream kann ich in deinem jetzt geposteten Code überhaupt nicht finden.
    Wieso das ?

  • Wenn ich da arbeiten würde...wäre ich wohl eher derjenige der anderen mit Lotus-Problemen hilft... :lol:


    Naja...das mit den Packagenamen sollte jetz ja nicht das Problem darstellen, oder?


    Das ist ganz einfach zu erklären. Mir ging es beim 1 Post darum, auf zu zeigen, das eine Importierte Datei (sei es .properties, .xml etc) nicht innerhalb Notes zugreifbar ist. Da war es für mich einfacher einen stinknormalen FileInputStream zu nutzen als die sehr vile mehr komplexere JPA.


    Wenn ich dich damit in die Irre geführt haben sollte, bitte ich dies zu entschuldigen.

  • Zugreifbar ist es schon, wie dir mein Link den ich dir als Antwort darauf gegeben habe geziegt haben sollte.


    Funktioniert es denn im Eclipse wenn du deine ganzen Dateien inklusive des Property-Files in einem jar zusammenfasst ?


    Denn technisch macht Notes im Designer nichts anderes

  • Okay...wenn diese innerhalb eines .jar liegt...leider kann ich das bei meinem Package nicht anwenden, da ich den Pfad zur xml nicht angeben kann. ;)


    Mir stellt sich die Frage, wozu ich im Designer eine eigen Javalib anlegen kann und zu dieser auch Resourcen mit anlegen kann, wenn auf diese dann nicht zugegriffen werden kann. :-?



    EDIT: Ja dann funktioniert es tadellos. Das is ja gerade das was mich wundert. komisch ist nur, dass der Designer aus meiner angelegten Javalib...LOKAL 3 .jar's erstellt.


    Code
    object.jar
    resource.jar
    source.jar


    object.jar beinhaltet die .class und source.jar die .java Dateien in der Package Structur meiner Javalib.


    In der resource.jar liegt meine xml.


    Wenn der Designer die 3 Dateien so auf den Domino Server überträgt, is ja klar wenn die xml nicht gefunden wird. Wie auch wenn sie in einer ganz anderen jar liegt.

  • Was jetzt ? Funktioniert es dann oder nicht ?


    Kann es sein, daß du mit dem Prinzip von Jars und Pfaden innerhalb von Java nicht wirklich vertraut bist ?


    Es ist völlig unerheblich in welchem Jar sich die Dateien befinden, wichtig sind nur die Pfade