Java EE (Java Platform, Enterprise Edition) ist eine durch Schnittstellen definierte Architektur für Unternehmensanwendungen, bestehend aus verschiedenen Komponenten.
Java-EE-Anwendungen werden auf Java EE Application Servern betrieben. Bekannte Java EE Application Server sind zum Beispiel: WildFly, JBoss, GlassFish, Oracle WebLogic, IBM WebSphere und Apache Geronimo. Weitere Server finden Sie unter: Java EE Compatible Implementations.
Oracle WebLogic 12.2.1 verwendet Java SE 8 und bietet Java EE 7. Das "c" in der Bezeichnung "12c" steht für Cloud-Fähigkeiten: Zusätzlich zu Standalone-Servern werden auch "PaaS", "Private Cloud" und "Oracle Public Cloud" unterstützt.
Falls Sie nicht Oracle WebLogic 12.2.1, sondern eine ältere WebLogic-Version einsetzen, finden Sie geeignete Hinweise eher unter Oracle WebLogic 12.1.3 und Oracle WebLogic 10.3.5.
Die von WebLogic 12.2.1 unterstützten Standards und die Unterschiede zu Vorgängerversionen finden Sie unter Oracle WebLogic Server 12.2.1, What's New in Oracle WebLogic Server 12.2.1, What's New in Oracle HTTP Server 12c (12.2.1), WebLogic Server 12.2.1 Compatibility with Previous Releases, WebLogic Server Compatibility, Issues / Release Notes for Oracle WebLogic Server, 12 Things You Should Know About WebLogic Server 12.2.1.
Datum | Java SE | Java EE | Servlet | JSF | JAX-RS | Jersey | EJB | JPA | |
---|---|---|---|---|---|---|---|---|---|
WebLogic 12cR2 (12.2.1.3) | Aug. 2017 | 8 | 7 | 3.1 | 2.2 | 2.0 | 2.22 | 3.2 | 2.1 |
WebLogic 12cR2 (12.2.1.2) | Okt. 2016 | 8 | 7 | 3.1 | 2.2 | 2.0 | 2.22 | 3.2 | 2.1 |
WebLogic 12cR2 (12.2.1.0) | Okt. 2015 | 8 | 7 | 3.1 | 2.2 | 2.0 | 2.22 | 3.2 | 2.1 |
WebLogic 12c (12.1.3) | Juni 2014 | 8 | 6 | 3.0 | 2.1 | 1.1 / 2.0 | 1.18 / 2.5 | 3.1 | 2.1 |
WebLogic 12c (12.1.2) | Juli 2013 | 7 | 6 | 3.0 | 2.1 | 1.1 | 1.17 | 3.1 | 2.0 |
WebLogic 11g (10.3.5) | Mai 2011 | 6 | 5 | 2.5 | 1.2 / 2.0 | 1.1 | 1.1.5 | 3.0 | 2.0 |
Zu den Bedeutungen der einzelnen Stellen in der WebLogic-Versionsbezeichnung siehe:
About WebLogic Server Version Numbers.
Zu den Sicherheitsproblemen und -patches zu den verschiedenen WebLogic-Versionen siehe:
CVE Details: Security Vulnerabilities Oracle Weblogic Server.
Zur Unterstützung von Java 9 siehe:
WebLogic Server and Java SE 9.
Einige wichtige Begriffe im WebLogic-Umfeld (genauere Erläuterungen finden Sie unter: Understanding Domain Configuration, Understanding Oracle WebLogic Server, Node Manager Overview, Starting and Stopping Servers):
WebLogic-Server können in sehr unterschiedlichen Strukturen eingesetzt werden. Der folgende Vergleich demonstriert drei verschiedene mögliche Szenarien:
Kleinstmögliche Struktur | Eine Maschine | Mehrere Maschinen |
Es gibt nur eine einzige WebLogic-Instanz, die gleichzeitig Admin-Server und Managed-Server darstellt. Es wird kein Node-Manager gestartet und kein Cluster konfiguriert. Diese einfache Variante wird in den folgenden Kapiteln meistens angenommen. |
In diesem Beispiel gibt es mehrere WebLogic-Instanzen, die alle auf einer Maschine installiert sind, und alle von einem Node-Manager gesteuert werden. Das Linux-Shell-Kommando |
Eine Domain und auch ein Cluster können sich über mehrere Maschinen erstrecken. Die dazu gehörenden managed WebLogic-Instanzen können auf mehrere Maschinen verteilt sein. Eine Maschine kann ein physischer Computer oder eine virtuelle Maschine (VM) sein. Pro Maschine kann es mehrere Domains geben. |
Siehe hierzu: WebLogic 12.2.1 im Docker-Container.
Die folgende Anleitung wurde getestet mit:
Voraussetzung ist ein installiertes aktuelles Java SE 8 JDK (zur Installation unter Linux siehe hier), sowie eine gesetzte JAVA_HOME-Environment-Variable:
Oracle bietet zwei Varianten der Installation an:
Downloaden Sie die .zip-Datei fmw_12.2.1.3.0_wls_Disk1_1of1.zip zum Generic Installer for Oracle WebLogic "Generic (800 MB)" von Oracle WebLogic Server Installers for Development und entzippen Sie die Datei. Sie erhalten die .jar-Datei fmw_12.2.1.3.0_wls.jar.
Starten Sie die Installation per GUI-Dialog, indem Sie diese .jar-Datei ausführen:
Sehen Sie sich Dokus zur Installation an: Oracle: Installing and Configuring Oracle WebLogic Server, Oracle: Using the Oracle Universal Installer in Silent Mode, WebLogic 12c Silent Installation, WebLogic-Grundlagen.
Erstellen Sie ein Verzeichnis für Installationsdateien, dessen Name und dessen Pfad kein Sonderzeichen, kein Leerzeichen und auch kein Minuszeichen enthält, und dessen Namensbestandteile nicht mit einem Unterstrich beginnen. Im Folgenden wird von folgenden Verzeichnissen ausgegangen:
Downloaden Sie von http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html als WebLogic-Installationsdatei eine der beiden Varianten (falls Sie RESTful Management Services verwenden wollen, müssen Sie den Generic Installer wählen):
Entzippen Sie die .zip-Datei und kopieren Sie die darin enthaltene .jar-Datei in Ihr oben angelegtes WebLogic1221_Install-Verzeichnis.
Führen Sie die Basisinstallation durch und überprüfen Sie das Ergebnis (passen Sie die Pfadangaben an):
Linux:
Führen Sie im Terminal-Fenster aus (das Terminal öffnen Sie z.B. unter Ubuntu mit: Strg+Alt+T)
(in diesem ersten Beispiel wird der Einfachheit halber im User-Home-Verzeichnis installiert;
weiter unten
folgt ein Beispiel für ein automatisierbares Skript mit Installation in
/opt/WebLogic1221
mit eigens angelegtem Benutzer):
cd ~/Tools/WebLogic1221_install
export _WL_BASIS_DIR=~/Tools/WebLogic1221
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
"$JAVA_HOME/bin/java" -jar fmw_12.2.1.3.0_wls_quick.jar -help
"$JAVA_HOME/bin/java" -jar fmw_12.2.1.3.0_wls_quick.jar -silent -logLevel finest -debug ORACLE_HOME=$_WL_BASIS_DIR
"$JAVA_HOME/bin/java" -jar fmw_12.2.1.3.0_wls.jar -help
"$JAVA_HOME/bin/java" -jar fmw_12.2.1.3.0_wls.jar -silent -logLevel finest -debug "INSTALL_TYPE=WebLogic Server" ORACLE_HOME=$_WL_BASIS_DIR
cat ~/oraInventory/ContentsXML/inventory.xml
cat $_WL_BASIS_DIR/oraInst.loc
. $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh
"$JAVA_HOME/bin/java" weblogic.version
"$JAVA_HOME/bin/java" weblogic.utils.Versions
Windows:
Öffnen Sie ein Kommandozeilenfenster mit Admin-Rechten per
"Win+X (Windows-Taste und gleichzeitig X) | Eingabeaufforderung (Administrator)"
und führen Sie aus:
cd /D C:\WebLogic1221_Install
set JAVA_HOME=C:\Program Files\Java\jdk1.8
"%JAVA_HOME%\bin\java" -jar fmw_12.2.1.3.0_wls_quick.jar -help
"%JAVA_HOME%\bin\java" -jar fmw_12.2.1.3.0_wls_quick.jar -silent -logLevel finest -debug ORACLE_HOME=C:\WebLogic
"%JAVA_HOME%\bin\java" -jar fmw_12.2.1.3.0_wls.jar -help
"%JAVA_HOME%\bin\java" -jar fmw_12.2.1.3.0_wls.jar -silent -logLevel finest -debug "INSTALL_TYPE=WebLogic Server" ORACLE_HOME=C:\WebLogic
type "C:\Program Files\Oracle\Inventory\ContentsXML\inventory.xml"
call C:\WebLogic\wlserver\server\bin\setWLSEnv.cmd
"%JAVA_HOME%\bin\java" weblogic.version
"%JAVA_HOME%\bin\java" weblogic.utils.Versions
Falls Sie die Fehlermeldung "Fehler beim Lesen der Antwortdatei. Installation wird abgebrochen. Oracle Universal Installer nicht erfolgreich." erhalten, dann überprüfen Sie noch mal genau die Pfade und Dateinamen und entfernen Sie fragwürdige Zeichen darin.
Falls Sie unter Linux die Fehlermeldung "Nicht genügend freier Speicherplatz in /tmp, um das Installationsprogramm zu extrahieren" erhalten, dann können Sie das tmp-Verzeichnis umdefinieren über den Kommandozeilenparameter: -Djava.io.tmpdir=....
Sie können WebLogic-Konfigurationen wahlweise interaktiv per GUI-Dialog oder automatisierbar mit Skripten durchführen. Falls Sie bestimmte WebLogic-Konfigurationsvorgänge mehrfach durchführen müssen, lohnt sich der Einsatz von WLST ("WebLogic Scripting Tool").
Im Folgenden wird ein WLST-Jython-Skript vorgestellt, welches die Konfigurationsschritte für eine WebLogic-Domain und eine DataSource automatisiert.
Es wird eine installierte MySQL-Datenbank voraussetzt.
Falls Sie eine MySQL-Datenbank neu installieren wollen, sehen Sie sich die Anleitung
MySQL unter Linux bzw.
MySQL unter Windows an.
Die MySQL-DB muss die DB "MeineDb" eingerichtet haben (z.B. per "CREATE DATABASE MeineDb;"), siehe hierzu
Anlage einer Database und einer Tabelle in MySQL.
Sie können natürlich auch eine andere Datenbank verwenden, aber dann müssen Sie die Einträge anpassen.
Legen Sie im oben angelegten Installationsdateienverzeichnis ~/Tools/WebLogic1221_install bzw. C:\WebLogic1221_Install folgende zwei Dateien an (passen Sie Pfade, Namen und andere Einträge an) (einige Elemente werden erst im Folgekapitel benötigt):
WebLogic12-DomainDbAuthUser.properties
_WL_BASIS_DIR= C:/WebLogic _WL_HOME= C:/WebLogic/wlserver _WL_START_TEMPL= C:/WebLogic/wlserver/common/templates/wls/wls.jar _WL_ADMIN_USER= weblogic _WL_ADMIN_PASSWORD= weblogic0 _WL_DOMAIN_NAME= MeineDomain _DB_DS_NAME= MeinMySqlDataSourceName _DB_DS_JNDI= jdbc/MeinDatasourceJndiName _DB_DRV= com.mysql.jdbc.Driver _DB_URL= jdbc:mysql://localhost:3306/MeineDb _DB_USR= root _DB_PWD= mysqlpwd _DB_SQL= SQL SELECT 1 _DB_GLOB_TX_PROT= None _USER1_NAME= MeinName1 _USER1_PWD= MeinPasswort1 _USER1_GROUP= Managers _USER2_NAME= MeinName2 _USER2_PWD= MeinPasswort2 _USER2_GROUP= Managers(Das WebLogic-Basisverzeichnis "C:/WebLogic" wird unter Linux mit sed durch den aktuell korrekten Pfad ersetzt, z.B. "~/Tools/WebLogic1221" oder "/opt/WebLogic1221", siehe hier und hier).
#===================================================================================== # WLST-Skript zur Konfiguration einer Domain und DataSource im WebLogic. # Parameter werden in Properties-Datei gesetzt: # WebLogic12-DomainDbAuthUser.properties # Aufruf unter Linux: # . $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh # "$JAVA_HOME/bin/java" weblogic.WLST WLST12-Domain-DataSource.py # Aufruf unter Windows: # call \WebLogic\wlserver\server\bin\setWLSEnv.cmd # "%JAVA_HOME%\bin\java" weblogic.WLST WLST12-Domain-DataSource.py #===================================================================================== def _createDatasource( _db_ds_name, _db_ds_jndi, _db_drv, _db_url, _db_usr, _db_pwd, _db_sql, _db_glob_tx_prot ): _datasource_cd_cmo = "/JDBCSystemResource/" + _db_ds_name + "/JdbcResource/" + _db_ds_name cd( "/" ) create( _db_ds_name, "JDBCSystemResource" ) cd( _datasource_cd_cmo ) create( "myJdbcDriverParams", "JDBCDriverParams" ) cd( "JDBCDriverParams/NO_NAME_0" ) set( "DriverName", _db_drv ) set( "URL", _db_url ) set( "PasswordEncrypted", _db_pwd ) create( "myProps", "Properties" ) cd( "Properties/NO_NAME_0" ) create( "user", "Property" ) cd( "Property/user" ) cmo.setValue( _db_usr ) cd( _datasource_cd_cmo ) create( "myJdbcDataSourceParams", "JDBCDataSourceParams" ) cd( "JDBCDataSourceParams/NO_NAME_0" ) set( "JNDIName", java.lang.String( _db_ds_jndi ) ) set( "GlobalTransactionsProtocol", _db_glob_tx_prot ) cd( _datasource_cd_cmo ) create( "myJdbcConnectionPoolParams", "JDBCConnectionPoolParams" ) cd( "JDBCConnectionPoolParams/NO_NAME_0" ) set( "TestTableName", _db_sql ) set( "LoginDelaySeconds", 1 ) cd( "/" ) assign( "JDBCSystemResource", _db_ds_name, "Target", "AdminServer" ) print "---- Datasource '" + _db_ds_name + "' mit JNDI-Namen '" + _db_ds_jndi + "' erstellt." loadProperties( "WebLogic12-DomainDbAuthUser.properties" ) readTemplate( _WL_START_TEMPL ) cd( "Servers/AdminServer" ) set( "ListenAddress", "" ) set( "ListenPort", 7001 ) create( "AdminServer", "SSL" ) cd( "SSL/AdminServer" ) set( "Enabled", "True" ) set( "ListenPort", 7002 ) cd( "/" ) cd( "Security/base_domain/User/" + _WL_ADMIN_USER ) cmo.setPassword( _WL_ADMIN_PASSWORD ) print "---- AdminServer mit Port 7001, SSL-Port 7002 und Admin-User '" + _WL_ADMIN_USER + "' angelegt." _createDatasource( _DB_DS_NAME, _DB_DS_JNDI, _DB_DRV, _DB_URL, _DB_USR, _DB_PWD, _DB_SQL, _DB_GLOB_TX_PROT ) cd( "/" ) setOption( "OverwriteDomain", "true" ) _domain_dir = _WL_BASIS_DIR + "/user_projects/domains/" + _WL_DOMAIN_NAME writeDomain( _domain_dir ) print "---- Fertig: Domain '" + _WL_DOMAIN_NAME + "' im Verzeichnis '" + _domain_dir + "' angelegt." closeTemplate() exit()
Falls Sie die "Silent-Basisinstallation ohne GUI-Dialog" gewählt haben, enthält Ihr WebLogic1221_Install-Installationsdateienverzeichnis jetzt folgende drei Dateien:
[WebLogic1221_Install] |- fmw_12.2.1.3.0_wls_quick.jar oder fmw_12.2.1.3.0_wls.jar |- WebLogic12-DomainDbAuthUser.properties '- WLST12-Domain-DataSource.py
Führen Sie das WLST-Jython-Skript folgendermaßen aus (Achtung: kann dauern) und überprüfen Sie das Ergebnis:
Linux:
export _WL_BASIS_DIR=~/Tools/WebLogic1221
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_OPTIONS="-Djava.security.egd=file:/dev/./urandom"
cd ~/Tools/WebLogic1221_install
sed -i "s|C:/WebLogic|$_WL_BASIS_DIR|" WebLogic12-DomainDbAuthUser.properties
. $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh
"$JAVA_HOME/bin/java" $JVM_ARGS weblogic.WLST WLST12-Domain-DataSource.py
cat $_WL_BASIS_DIR/user_projects/domains/MeineDomain/config/config.xml
cat $_WL_BASIS_DIR/user_projects/domains/MeineDomain/config/jdbc/*-jdbc.xml
Windows:
Öffnen Sie ein Kommandozeilenfenster mit Admin-Rechten per
"Win+X | Eingabeaufforderung (Administrator)"
und führen Sie aus:
set JAVA_HOME=C:\Program Files\Java\jdk1.8
cd /D C:\WebLogic1221_Install
call C:\WebLogic\wlserver\server\bin\setWLSEnv.cmd
"%JAVA_HOME%\bin\java" weblogic.WLST WLST12-Domain-DataSource.py
type C:\WebLogic\user_projects\domains\MeineDomain\config\config.xml
type C:\WebLogic\user_projects\domains\MeineDomain\config\jdbc\*-jdbc.xml
Sie erhalten:
---- AdminServer mit Port 7001, SSL-Port 7002 und Admin-User 'weblogic' angelegt.
---- Datasource 'MeinMySqlDataSourceName' mit JNDI-Namen 'jdbc/MeinDatasourceJndiName' erstellt.
---- Fertig: Domain 'MeineDomain' im Verzeichnis '...WebLogic...user_projects...domains...MeineDomain' angelegt.
Starten und stoppen Sie WebLogic über folgende Kommandozeilenbefehle:
~/Tools/WebLogic1221/user_projects/domains/MeineDomain/bin/startWebLogic.sh
~/Tools/WebLogic1221/user_projects/domains/MeineDomain/bin/stopWebLogic.sh
C:\WebLogic\user_projects\domains\MeineDomain\bin\startWebLogic.cmd
C:\WebLogic\user_projects\domains\MeineDomain\bin\stopWebLogic.cmd
Kontrollieren Sie beim Serverstart die Meldungen, insbesondere:
JAVA Memory arguments ...
CLASSPATH ...
PATH ...
Starting WLS with line ...
Java ...
Version: WebLogic Server ...
Warten Sie, bis die Erfolgsmeldung erscheint:
<Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.>
Sehen Sie sich an:
$_WL_BASIS_DIR/user_projects/domains/MeineDomain/servers/AdminServer/logs/AdminServer.log
$_WL_BASIS_DIR/user_projects/domains/MeineDomain/servers/AdminServer/logs/MeineDomain.log
Die WebLogic-Administrationskonsole erreichen Sie bei laufendem WebLogic über (Username/Password wie oben vergeben, also z.B. weblogic/weblogic0):
Sehen Sie sich die WebLogic-Doku an:
Falls Sie eine (z.B. per WebLogic-Console erstellte) lauffähige WebLogic-Konfiguration haben, brauchen Sie das dieser Konfiguration entsprechende WLST-Skript nicht von Hand zu erstellen, sondern können es per configToScript()-WLST-Kommando generieren lassen.
Sehen Sie sich zu WLST die Beispiele im Verzeichnis $_WL_BASIS_DIR/wlserver/common/templates/scripts/wlst und die Doku unter http://docs.oracle.com/middleware/1221/wls/WLSTG, http://docs.oracle.com/cd/E13222_01/wls/docs103/config_scripting/reference.html, http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/, http://docs.oracle.com/cd/E12840_01/wls/docs103/pdf/config_scripting.pdf, http://weblogic.sys-con.com/node/48932 und http://wiki.python.org/jython/UserGuide an.
Um die WebLogic-Installation zu testen, sollten Sie eine Beispiel-WAR-Datei deployen und aufrufen.
Wenn Sie kein Maven installiert haben, können Sie ein kleines Test-Hello-World-Webanwendungsprojekt inklusive fertiger WAR-Datei downloaden, entzippen, und die WAR-Datei kopieren (ersetzen Sie $_WL_BASIS_DIR durch Ihren WebLogic-Basispfad, z.B. ~/Tools/WebLogic1221 bzw. C:\WebLogic1221):
wget http://www.torsten-horn.de/proj/MvnWebApp.zip
unzip MvnWebApp.zip
cp MvnWebApp/target/MvnWebApp.war $_WL_BASIS_DIR/user_projects/domains/MeineDomain/autodeploy/
Falls Sie Maven installiert haben (Installation siehe Maven unter Linux bzw. Maven unter Windows), können Sie sehr leicht dieselbe Test-Hello-World-Webanwendung selbst erstellen, im WebLogic deployen und die Hello-World-Webseite anzeigen:
export _WL_BASIS_DIR=~/Tools/WebLogic1221
$_WL_BASIS_DIR/user_projects/domains/MeineDomain/bin/startWebLogic.sh &
mkdir ~/MeinWorkspace
cd ~/MeinWorkspace
mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=de.meinefirma.meinprojekt -DartifactId=MvnWebApp
cd MvnWebApp
mvn package
cp target/MvnWebApp.war $_WL_BASIS_DIR/user_projects/domains/MeineDomain/autodeploy/
Warten Sie ein paar Sekunden und rufen Sie auf:
firefox http://localhost:7001/MvnWebApp
C:\WebLogic\user_projects\domains\MeineDomain\bin\startWebLogic.cmd
md \MeinWorkspace
cd \MeinWorkspace
mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=de.meinefirma.meinprojekt -DartifactId=MvnWebApp
cd MvnWebApp
mvn package
copy target\MvnWebApp.war C:\WebLogic\user_projects\domains\MeineDomain\autodeploy\
Warten Sie ein paar Sekunden und rufen Sie auf:
Sie erhalten die Hello-World-Webseite:
WebLogic speichert Benutzer- und Gruppen-Informationen zur Authentifizierung normalerweise über den "DefaultAuthenticator" in einem internen dateibasierten "Embedded LDAP Server".
Falls auch andere Programme (z.B. eigene Java-Anwendungen) auf die Benutzer- und Gruppen-Informationen zugreifen sollen, kann es günstiger sein, diese stattdessen in der Datenbank vorzuhalten. Dies bietet der "SQLAuthenticator"
Für den WebLogic-SQLAuthenticator müssen folgendermaßen Tabellen in der Datenbank angelegt werden (vorausgesetzt, Sie verwenden die Default-Tabellen- und -Spaltennamen):
CREATE TABLE USERS ( U_NAME VARCHAR(200) NOT NULL, U_PASSWORD VARCHAR(50) NOT NULL, U_DESCRIPTION VARCHAR(1000) ); CREATE TABLE GROUPS ( G_NAME VARCHAR(200) NOT NULL, G_DESCRIPTION VARCHAR(1000) NULL ); CREATE TABLE GROUPMEMBERS ( G_NAME VARCHAR(200) NOT NULL, G_MEMBER VARCHAR(200) NOT NULL ); ALTER TABLE USERS ADD CONSTRAINT PK_USERS PRIMARY KEY ( U_NAME ); ALTER TABLE GROUPS ADD CONSTRAINT PK_GROUPS PRIMARY KEY ( G_NAME ); ALTER TABLE GROUPMEMBERS ADD CONSTRAINT PK_GROUPMEMS PRIMARY KEY ( G_NAME, G_MEMBER ); ALTER TABLE GROUPMEMBERS ADD CONSTRAINT FK1_GROUPMEMBERS FOREIGN KEY ( G_NAME ) REFERENCES GROUPS ( G_NAME ) ON DELETE CASCADE;
Sie können die genannten SQL-Kommandos kopieren und in einem GUI-Datenbank-Client (beispielsweise SQuirrel) einfügen und ausführen. Alternativ können Sie die Kommandos als Skript speichern (z.B. in UsersGroupsMembers.sql) und per Kommandozeile in die DB übernehmen, beispielsweise so für "MySQL / MeineDb":
mysql -DMeineDb -uroot -pmysqlpwd < UsersGroupsMembers.sql
Folgendermaßen können Sie Users und Groups manuell anlegen (falls "Nur-Text-Kennwörter aktiviert" ausgeschaltet ist ("PlaintextPasswordsEnabled=false"), müssen Sie das Passwörter verschlüsselt einsetzen):
INSERT INTO USERS VALUES ( 'MeinName', 'MeinPasswort0', 'MeinName' ); INSERT INTO GROUPS VALUES ( 'Managers', 'Managers' ); INSERT INTO GROUPMEMBERS VALUES ( 'Managers', 'MeinName' );
Alternativ zur manuelle Konfiguration eines SQLAuthenticators können Sie eine automatische Konfiguration eines SQLAuthenticators per WLST durchführen, ähnlich wie im obigen Beispiel Silent-Konfiguration der Domain und DataSource mit WLST.
Im Folgenden wird eine komplette WebLogic-Installation ausgehend von der Installationsdatei fmw_12.2.1.3.0_wls_quick.jar oder fmw_12.2.1.3.0_wls.jar als automatisiert ausführbares Batch-Skript implementiert.
Für die Linux-Installation gilt:
Um die Installation realitätsnäher zu gestalten, wird diesmal nicht im User-Home-Verzeichnis in
~/Tools/WebLogic1221
installiert, sondern stattdessen in
/opt/WebLogic1221,
und es wird ein neu angelegter spezieller
WebLogic-Benutzer "wlusr" (in der Gruppe "wlgrp") eingesetzt.
Falls Sie bereits einen WebLogic im gewünschten Zielverzeichnis installiert haben, müssen Sie entweder die entsprechenden Schritte in den folgenden Skripten überspringen, oder das WebLogic-Verzeichnis umbenennen, oder die vorhandene Installation löschen:
Falls noch nicht geschehen:
Führen Sie zuerst die folgenden oben beschrieben Schritte aus:
a) Legen Sie das Installationsdateienverzeichnis
~/Tools/WebLogic1221_install bzw.
C:\WebLogic1221_Install an.
b) Kopieren Sie in das Installationsdateienverzeichnis als WebLogic-Installationsdatei entweder
fmw_12.2.1.3.0_wls_quick.jar oder
fmw_12.2.1.3.0_wls.jar.
c) Erzeugen Sie die beiden Dateien
WebLogic12-DomainDbAuthUser.properties und
WLST12-Domain-DataSource.py.
Falls die WebLogic12-DomainDbAuthUser.properties-Datei noch vom letzten Beispiel existiert: Bitte ersetzen Sie den Inhalt durch den ursprünglichen Inhalt, damit die Ersetzung mit sed korrekt funktioniert.
Ihr WebLogic1221_Install-Installationsdateienverzeichnis enthält jetzt diese drei Dateien:
[WebLogic1221_Install] |- fmw_12.2.1.3.0_wls_quick.jar oder fmw_12.2.1.3.0_wls.jar |- WebLogic12-DomainDbAuthUser.properties '- WLST12-Domain-DataSource.py
Erzeugen Sie in diesem Verzeichnis die folgenden drei weiteren Dateien:
WLST12-SQLAuthenticator.py
#===================================================================================== # WLST-Skript zur Konfiguration eines SQLAuthenticators im WebLogic. # Parameter werden in Properties-Datei gesetzt: # WebLogic12-DomainDbAuthUser.properties # Aufruf unter Linux: # . $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh # "$JAVA_HOME/bin/java" weblogic.WLST WLST12-SQLAuthenticator.py # Aufruf unter Windows: # call \WebLogic\wlserver\server\bin\setWLSEnv.cmd # "%JAVA_HOME%\bin\java" weblogic.WLST WLST12-SQLAuthenticator.py #===================================================================================== print "---- Beginn ----" loadProperties( "WebLogic12-DomainDbAuthUser.properties" ) if connected == "false": connect( _WL_ADMIN_USER, _WL_ADMIN_PASSWORD ) edit() startEdit() _DomainName = cmo.getName() _RealmName = cmo.getSecurityConfiguration().getDefaultRealm().getName() _DfltAuth = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "DefaultAuthenticator" ) _SqlAuth = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "MeinSQLAuthenticator" ) _Realm_cd_cmo = "/SecurityConfiguration/" + _DomainName + "/Realms/" + _RealmName print print "---- DomainName =", _DomainName print "---- RealmName =", _RealmName if _DfltAuth != None: cd( _Realm_cd_cmo + "/AuthenticationProviders/DefaultAuthenticator" ) set( "ControlFlag", "SUFFICIENT" ) print "---- DefaultAuthenticator konfiguriert (ControlFlag = SUFFICIENT)." if _SqlAuth == None: cd( _Realm_cd_cmo ) cmo.createAuthenticationProvider( "MeinSQLAuthenticator", "weblogic.security.providers.authentication.SQLAuthenticator" ) cd( _Realm_cd_cmo + "/AuthenticationProviders/MeinSQLAuthenticator" ) set( "ControlFlag", "OPTIONAL" ) set( "DataSourceName", _DB_DS_NAME ) set( "PlaintextPasswordsEnabled", "false" ) set( "GroupMembershipSearching", "limited" ) set( "MaxGroupMembershipSearchLevel", "5" ) print "---- MeinSQLAuthenticator konfiguriert (ControlFlag = OPTIONAL, DataSourceName = " + _DB_DS_NAME + ")." print "---- Fertig ----" print save() activate(block="true") disconnect() exit()
WLST12-UsersGroupsMembers.py
#===================================================================================== # WLST-Skript zur Konfiguration von Benutzern und Benutzergruppen im WebLogic. # Parameter werden in Properties-Datei gesetzt: # WebLogic12-DomainDbAuthUser.properties # Aufruf unter Linux: # . $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh # "$JAVA_HOME/bin/java" weblogic.WLST WLST12-UsersGroupsMembers.py # Aufruf unter Windows: # call \WebLogic\wlserver\server\bin\setWLSEnv.cmd # "%JAVA_HOME%\bin\java" weblogic.WLST WLST12-UsersGroupsMembers.py #===================================================================================== def _createUserGroupMember( _usr, _pwd, _grp ): if _SqlAuth.userExists( _usr ) != 1: _SqlAuth.createUser( _usr, _pwd, _usr ) if _SqlAuth.groupExists( _grp ) != 1: _SqlAuth.createGroup( _grp, _grp ) _SqlAuth.addMemberToGroup( _grp, _usr ) print "---- User '" + _usr + "' in Group '" + _grp + "' eingetragen." print "---- Beginn ----" loadProperties( "WebLogic12-DomainDbAuthUser.properties" ) if connected == "false": connect( _WL_ADMIN_USER, _WL_ADMIN_PASSWORD ) _SqlAuth = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "MeinSQLAuthenticator" ) if _SqlAuth == None: print "---- Fehler: MeinSQLAuthenticator muss zuerst angelegt werden. ----" else: _createUserGroupMember( _USER1_NAME, _USER1_PWD, _USER1_GROUP ) _createUserGroupMember( _USER2_NAME, _USER2_PWD, _USER2_GROUP ) print "---- Fertig ----" print disconnect() exit()
WebLogic12-DomainDbAuthUser.sh
#!/bin/bash _WL_USR=wlusr _WL_GRP=wlgrp _ORA_INVENTORY_LOC=/home/$_WL_USR/oraInventory echo "date: "`date` echo "whoami: "`whoami` echo "_WL_DOMAIN_NAME: $_WL_DOMAIN_NAME" echo "_WL_USR / _WL_GRP: $_WL_USR / $_WL_GRP" echo "JAVA_HOME: $JAVA_HOME" echo "pwd: "`pwd` echo "_WL_BASIS_DIR: $_WL_BASIS_DIR" echo "_ORA_INVENTORY_LOC: $_ORA_INVENTORY_LOC" if [[ $_WL_USR != `whoami` ]] ; then echo -e "\nFehler: Benutzer muss $_WL_USR sein.\n" ; exit 1 ; fi if [ ! -n "$JAVA_HOME" ] ; then echo -e "\nFehler: JAVA_HOME ist nicht definiert.\n" ; exit 1 ; fi if [ ! -n "$_WL_DOMAIN_NAME" ] ; then echo -e "\nFehler: _WL_DOMAIN_NAME fuer den WebLogic-Domain-Namen ist nicht definiert.\n" ; exit 1 ; fi if [ ! -n "$_WL_BASIS_DIR" ] ; then echo -e "\nFehler: _WL_BASIS_DIR fuer das WebLogic-Zielverzeichnis ist nicht definiert.\n" ; exit 1 ; fi if [ ! -d "$_WL_BASIS_DIR" ] ; then echo -e "\nFehler: Das WebLogic-Zielverzeichnis $_WL_BASIS_DIR fehlt.\n" ; exit 1 ; fi if [ "$(ls -A $_WL_BASIS_DIR)" ] ; then echo -e "\nFehler: Das WebLogic-Zielverzeichnis $_WL_BASIS_DIR ist nicht leer.\n" ; exit 1 ; fi if [ ! -f $JAVA_HOME/bin/java ] ; then echo -e "\nFehler: JAVA_HOME ist falsch, $JAVA_HOME/bin/java fehlt.\n" ; exit 1 ; fi if [ ! -f WLST12-Domain-DataSource.py ] ; then echo -e "\nFehler: WLST12-Domain-DataSource.py fehlt.\n" ; exit 1 ; fi if [ ! -f WLST12-SQLAuthenticator.py ] ; then echo -e "\nFehler: WLST12-SQLAuthenticator.py fehlt.\n" ; exit 1 ; fi if [ ! -f WLST12-UsersGroupsMembers.py ] ; then echo -e "\nFehler: WLST12-UsersGroupsMembers.py fehlt.\n" ; exit 1 ; fi if [ ! -f WebLogic12-DomainDbAuthUser.properties ] ; then echo -e "\nFehler: WebLogic12-DomainDbAuthUser.properties fehlt.\n" ; exit 1 ; fi if grep -iq "C:/WebLogic" WebLogic12-DomainDbAuthUser.properties ; then echo -e "\nFehler1 mit _WL_BASIS_DIR in WebLogic12-DomainDbAuthUser.properties.\n" ; exit 1 ; fi if ! grep -iq "$_WL_BASIS_DIR" WebLogic12-DomainDbAuthUser.properties ; then echo -e "\nFehler2 mit _WL_BASIS_DIR in WebLogic12-DomainDbAuthUser.properties.\n" ; exit 1 ; fi if netstat -ant | grep -q ':7001' ; then echo -e "\nFehler: WebLogic laeuft.\n" ; exit 1 ; fi if [ ! -f fmw_12.2.1.*.jar ] && [ -f ~/Downloads/fmw_12.2.1.3.0_wls_Disk1_1of1.zip ] then unzip ~/Downloads/fmw_12.2.1.3.0_wls_Disk1_1of1.zip ; fi _WL_INST_JAR= if [ -f fmw_12.2.1.2.0_wls_quick.jar ] ; then _WL_INST_JAR=fmw_12.2.1.2.0_wls_quick.jar ; fi if [ -f fmw_12.2.1.2.0_wls.jar ] ; then _WL_INST_JAR=fmw_12.2.1.2.0_wls.jar ; fi if [ -f fmw_12.2.1.3.0_wls_quick.jar ] ; then _WL_INST_JAR=fmw_12.2.1.3.0_wls_quick.jar ; fi if [ -f fmw_12.2.1.3.0_wls.jar ] ; then _WL_INST_JAR=fmw_12.2.1.3.0_wls.jar ; fi echo "_WL_INST_JAR: $_WL_INST_JAR" if [ ! -n "$_WL_INST_JAR" ] ; then echo -e "\nFehler: fmw_12.2.1.*.jar fehlt.\n" ; exit 1 ; fi if [ ! -d "$_ORA_INVENTORY_LOC" ] ; then mkdir $_ORA_INVENTORY_LOC ; fi echo inventory_loc=$_ORA_INVENTORY_LOC > $_ORA_INVENTORY_LOC/oraInst.loc echo inst_group=$_WL_GRP >> $_ORA_INVENTORY_LOC/oraInst.loc echo -e "\n---- Silent-Basisinstallation:" if [[ $_WL_INST_JAR == *quick* ]] then if ! "$JAVA_HOME/bin/java" -jar $_WL_INST_JAR -silent -debug -logLevel finest -invPtrLoc $_ORA_INVENTORY_LOC/oraInst.loc ORACLE_HOME=$_WL_BASIS_DIR then echo -e "\nFehler mit WebLogic-Silent-Basisinstallation.\n" ; exit $? ; fi else if ! "$JAVA_HOME/bin/java" -jar $_WL_INST_JAR -silent -debug -logLevel finest "INSTALL_TYPE=WebLogic Server" -invPtrLoc $_ORA_INVENTORY_LOC/oraInst.loc ORACLE_HOME=$_WL_BASIS_DIR then echo -e "\nFehler mit WebLogic-Silent-Basisinstallation.\n" ; exit $? ; fi fi echo -e "\n---- Environment aufsetzen mit setWLSEnv.sh:" . $_WL_BASIS_DIR/wlserver/server/bin/setWLSEnv.sh if ! "$JAVA_HOME/bin/java" weblogic.version then echo -e "\nFehler mit WebLogic.\n" ; exit $? ; fi echo -e "\n---- WLST12-Domain-DataSource.py:" if ! "$JAVA_HOME/bin/java" $JVM_ARGS weblogic.WLST WLST12-Domain-DataSource.py then echo -e "\nFehler mit WLST12-Domain-DataSource.py.\n" ; exit $? ; fi $_WL_BASIS_DIR/user_projects/domains/$_WL_DOMAIN_NAME/bin/startWebLogic.sh & while ! netstat -ant | grep -q ':7001' do echo Warten auf WebLogic ... ; sleep 5 done echo -e "\n---- WLST12-SQLAuthenticator.py:" if ! "$JAVA_HOME/bin/java" $JVM_ARGS weblogic.WLST WLST12-SQLAuthenticator.py then echo -e "\nFehler mit WLST12-SQLAuthenticator.py.\n" ; exit $? ; fi $_WL_BASIS_DIR/user_projects/domains/$_WL_DOMAIN_NAME/bin/stopWebLogic.sh netstat -ant | grep ':7001' while netstat -ant | grep -q ':7001' do echo Warten auf Port-Freigabe ... ; sleep 5 done $_WL_BASIS_DIR/user_projects/domains/$_WL_DOMAIN_NAME/bin/startWebLogic.sh & while ! netstat -ant | grep -q ':7001' do echo Warten auf WebLogic ... ; sleep 5 done echo -e "\n---- WLST12-UsersGroupsMembers.py:" if ! "$JAVA_HOME/bin/java" $JVM_ARGS weblogic.WLST WLST12-UsersGroupsMembers.py then echo -e "\nFehler mit WLST12-UsersGroupsMembers.py.\n" ; exit $? ; fi $_WL_BASIS_DIR/user_projects/domains/$_WL_DOMAIN_NAME/bin/stopWebLogic.sh netstat -ant | grep ':7001' while netstat -ant | grep -q ':7001' do echo Warten auf Port-Freigabe ... ; sleep 5 done echo "date: "`date` echo -e "\n---- OK ----\n"
WebLogic12-DomainDbAuthUser.bat
@title WebLogic12-DomainDbAuthUser.bat @echo off echo. set _WL_BASIS_DIR=C:\WebLogic set _WL_DOMAIN_NAME=MeineDomain set _WL_INST_JAR= if exist fmw_12.2.1.2.0_wls_quick.jar set _WL_INST_JAR=fmw_12.2.1.2.0_wls_quick.jar if exist fmw_12.2.1.2.0_wls.jar set _WL_INST_JAR=fmw_12.2.1.2.0_wls.jar if exist fmw_12.2.1.3.0_wls_quick.jar set _WL_INST_JAR=fmw_12.2.1.3.0_wls_quick.jar if exist fmw_12.2.1.3.0_wls.jar set _WL_INST_JAR=fmw_12.2.1.3.0_wls.jar echo. if "%_WL_INST_JAR%" == "" ( echo Fehler: WebLogic-Installations-JAR-Datei fmw_12.2.1.*.jar fehlt. goto _Ende; ) for /F %%i in ('dir /b "%_WL_BASIS_DIR%\*.*"') do ( echo Fehler: WebLogic-Installations-Verzeichnis %_WL_BASIS_DIR% ist nicht leer. goto _Ende; ) time /T echo. @echo on @echo %_WL_INST_JAR% | findstr /C:quick > nul && ( "%JAVA_HOME%\bin\java" -jar %_WL_INST_JAR% -silent -debug -logLevel finest ORACLE_HOME=%_WL_BASIS_DIR% if errorlevel 1 goto _Ende; ) || ( "%JAVA_HOME%\bin\java" -jar %_WL_INST_JAR% -silent -debug -logLevel finest "INSTALL_TYPE=WebLogic Server" ORACLE_HOME=%_WL_BASIS_DIR% if errorlevel 1 goto _Ende; ) @setlocal call %_WL_BASIS_DIR%\wlserver\server\bin\setWLSEnv.cmd @echo on "%JAVA_HOME%\bin\java" weblogic.version if errorlevel 1 goto _Ende; "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-Domain-DataSource.py if errorlevel 1 goto _Ende; @endlocal start cmd /C %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\startWebLogic.cmd :Warte_1_auf_WebLogic @echo Warten auf WebLogic ... @ping -n 5 127.0.0.1 >nul @netstat -an | find "TCP 127.0.0.1:7001" | find "ABH" @if errorlevel 1 goto Warte_1_auf_WebLogic @setlocal call %_WL_BASIS_DIR%\wlserver\server\bin\setWLSEnv.cmd @echo on "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-SQLAuthenticator.py if errorlevel 1 goto _Ende; @endlocal pushd . call %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\stopWebLogic.cmd popd @netstat -an | find "TCP 127.0.0.1:7001" :Warte_auf_Portfreigabe @echo Warten auf Portfreigabe ... @ping -n 5 127.0.0.1 >nul @netstat -an | find "TCP 127.0.0.1:7001" | find "ABH" @if not errorlevel 1 goto Warte_auf_Portfreigabe start cmd /C %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\startWebLogic.cmd :Warte_2_auf_WebLogic @echo Warten auf WebLogic ... @ping -n 5 127.0.0.1 >nul @netstat -an | find "TCP 127.0.0.1:7001" | find "ABH" @if errorlevel 1 goto Warte_2_auf_WebLogic @setlocal call %_WL_BASIS_DIR%\wlserver\server\bin\setWLSEnv.cmd @echo on "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-UsersGroupsMembers.py if errorlevel 1 goto _Ende; @endlocal pushd . call %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\stopWebLogic.cmd popd time /T @echo. @echo ---- OK ---- @echo. :_Ende pause
Ihr WebLogic1221_Install-Installationsdateienverzeichnis enthält jetzt folgende sechs Dateien:
[WebLogic1221_Install] |- fmw_12.2.1.3.0_wls_quick.jar oder fmw_12.2.1.3.0_wls.jar |- WebLogic12-DomainDbAuthUser.sh bzw. WebLogic12-DomainDbAuthUser.bat |- WebLogic12-DomainDbAuthUser.properties |- WLST12-Domain-DataSource.py |- WLST12-SQLAuthenticator.py '- WLST12-UsersGroupsMembers.py
Starten Sie die Datenbank und legen Sie die oben beschriebenen DB-Tabellen an.
Führen Sie das Batch-Skript aus und überprüfen Sie das Ergebnis (die Ausführung kann über 15 Minuten dauern):
Linux:
Um das Skript realitätsnäher auszuführen, wird diesmal nicht im User-Home-Verzeichnis installiert,
sondern unter "/opt" mit dem neu angelegten speziellen
WebLogic-Benutzer "wlusr" (in der Gruppe "wlgrp")
(passen Sie die Variablen an, und merken Sie sich das für wlusr vergebene Passwort):
export _WL_USR=wlusr
export _WL_GRP=wlgrp
export _WL_BASIS_DIR=/opt/WebLogic1221
export _WL_DOMAIN_NAME=MeineDomain
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_OPTIONS="-Djava.security.egd=file:/dev/./urandom"
cd ~/Tools/WebLogic1221_install
sed -i "s|C:/WebLogic|$_WL_BASIS_DIR|" WebLogic12-DomainDbAuthUser.properties
sed -i "s|$HOME/Tools/WebLogic1221|$_WL_BASIS_DIR|" WebLogic12-DomainDbAuthUser.properties
chmod +x WebLogic12-DomainDbAuthUser.sh
sudo addgroup $_WL_GRP
sudo adduser $_WL_USR --ingroup $_WL_GRP
sudo usermod -aG $_WL_GRP,sudo $_WL_USR
su $_WL_USR
env | grep -i _WL
sudo mkdir $_WL_BASIS_DIR
sudo chown -R $_WL_USR:$_WL_GRP $_WL_BASIS_DIR
sudo chmod -R 775 $_WL_BASIS_DIR
ls -al $_WL_BASIS_DIR/..
./WebLogic12-DomainDbAuthUser.sh
cat $_WL_BASIS_DIR/user_projects/domains/MeineDomain/config/config.xml
cat $_WL_BASIS_DIR/user_projects/domains/MeineDomain/config/jdbc/*-jdbc.xml
Windows:
Öffnen Sie ein Kommandozeilenfenster mit Admin-Rechten per
"Win+X | Eingabeaufforderung (Administrator)"
und führen Sie aus:
set JAVA_HOME=C:\Program Files\Java\jdk1.8
cd /D C:\WebLogic1221_Install
call WebLogic12-DomainDbAuthUser.bat
type C:\WebLogic\user_projects\domains\MeineDomain\config\config.xml
type C:\WebLogic\user_projects\domains\MeineDomain\config\jdbc\*-jdbc.xml
Starten und stoppen Sie WebLogic über folgende Kommandozeilenbefehle:
su wlusr
/opt/WebLogic1221/user_projects/domains/MeineDomain/bin/startWebLogic.sh
/opt/WebLogic1221/user_projects/domains/MeineDomain/bin/stopWebLogic.sh
C:\WebLogic\user_projects\domains\MeineDomain\bin\startWebLogic.cmd
C:\WebLogic\user_projects\domains\MeineDomain\bin\stopWebLogic.cmd
Sehen Sie sich folgende MBean-API-Dokus an:
http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/index.html?weblogic/security/providers/authentication/DefaultAuthenticatorMBean.html,
http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/index.html?weblogic/security/providers/authentication/SQLAuthenticatorMBean.html
Um den SQLAuthenticator in einer Webanwendung zu nutzen, müssen Sie die web.xml erweitern und eine weblogic.xml hinzufügen.
Erweitern Sie die WEB-INF/web.xml um folgenden Block (z.B. vor dem </web-app>-Endtag):
<security-constraint> <web-resource-collection> <web-resource-name>Meine WebApp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>Manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>Meine WebApp</realm-name> </login-config> <security-role> <role-name>Manager</role-name> </security-role>
(Vergleichen Sie die ähnlichen web.xml-Einträge beim Authentifizierung-Beispiel für REST mit Tomcat.)
Fügen Sie eine WEB-INF/weblogic.xml mit folgendem Inhalt hinzu:
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd"> <security-role-assignment> <role-name>Manager</role-name> <principal-name>Managers</principal-name> </security-role-assignment> </weblogic-web-app>
Bitte beachten Sie den kleinen Unterschied im Rollennamen Manager und im Gruppennamen Managers.
Sehen Sie sich zur weblogic.xml-Struktur an:
http://docs.oracle.com/cd/E23943_01/web.1111/e13712/weblogic_xml.htm.
Um den SQLAuthenticator zu testen, sollten Sie eine Beispiel-WAR-Datei deployen und aufrufen.
Wenn Sie kein Maven installiert haben, können Sie ein kleines Test-Hello-World-Webanwendungsprojekt inklusive fertiger WAR-Datei downloaden, entzippen, und die WAR-Datei kopieren (ersetzen Sie $_WL_BASIS_DIR durch Ihren WebLogic-Basispfad, z.B. /opt/WebLogic1221 bzw. C:\WebLogic1221):
wget http://www.torsten-horn.de/proj/MvnWebAppSqlAuth.zip
unzip MvnWebAppSqlAuth.zip
sudo cp MvnWebAppSqlAuth/target/MvnWebApp.war $_WL_BASIS_DIR/user_projects/domains/MeineDomain/autodeploy/
Falls Sie Maven installiert haben (Installation siehe Maven unter Linux bzw. Maven unter Windows), können Sie sehr leicht dieselbe Test-Hello-World-Webanwendung selbst erstellen, im WebLogic deployen und die Hello-World-Webseite anzeigen, indem Sie die oben gezeigte Test-Hello-World-Webanwendung erstellen, im Verzeichnis "MvnWebApp/src/main/webapp/WEB-INF" die beiden genannten Erweiterungen hinzufügen, das Projekt mit "mvn package" neu bauen und erneut deployen, indem Sie wieder die resultierende WAR-Datei in das WebLogic-autodeploy-Verzeichnis kopieren.
Anschließend erreichen Sie die Hello-World-Webseite (http://localhost:7001/MvnWebApp) nur noch nach erfolgreicher Anmeldung (Benutzername und Passwort wie oben vergeben, also z.B. MeinName1/MeinPasswort1).
Für große Java-EE-Anwendungen sollten Sie mehr Arbeitsspeicher zur Verfügung stellen. Um mit 256 MByte zu starten und maximal 1024 MByte zu erlauben, fügen Sie dem Java-Startkommando in startWebLogic.cmd die Parameter "-Xms256m -Xmx1024m" hinzu. Oder Sie rufen startWebLogic.cmd über eine vorgeschaltete Batchdatei mit folgendem Inhalt auf:
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xms256m -Xmx1024m
startWeblogic.cmd
Für Remote-Debugging (z.B. mit Eclipse) rufen Sie startWebLogic.cmd über eine vorgeschaltete Batchdatei mit folgendem Inhalt auf:
set JAVA_OPTIONS=%JAVA_OPTIONS% -agentlib:jdwp=transport=dt_socket,address=8001,server=y,suspend=n
startWeblogic.cmd
Tracing für JDBC/JTA/JTS schalten Sie ein, indem Sie dem Startkommando folgende Kommandozeilenoption hinzufügen:
-Dweblogic.Debug=weblogic.JDBCConn,weblogic.JDBCSQL,weblogic.JTA2PC,weblogic.JTAXA,weblogic.JTAJDBC
Falls Sie auf JMX basierende Monitoring-Tools verwenden wollen, muss das Startkommando um den "-Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder"- und zusätzlich entweder um den "-Dcom.sun.management.jmxremote"-Parameter (falls Sun-JDK) oder um den "-Xmanagement"-Parameter (falls JRockit) erweitert werden (siehe hierzu Startparameter).
Beachten Sie, dass die Batchdatei startWebLogic.cmd nicht aufgerufen wird, wenn Sie WebLogic als Windows-Dienst starten.
Sehen Sie sich hierzu die Beschreibung an unter: http://docs.oracle.com/middleware/1221/wls/START/winservice.htm.
Passen Sie je nach WebLogic-Version in der Datei
C:\WebLogic\wlserver\common\bin\commEnv.cmd oder
C:\WebLogic\oracle_common\common\bin\commEnv.cmd
an mehreren Stellen Zeilen ähnlich zu
set MEM_ARGS=-Xms128m -Xmx256m
an Ihre Bedürfnisse an, setzen Sie beispielsweise:
set MEM_ARGS=-Xms500m -Xmx1500m
Erstellen Sie eine Batchdatei "installWebLogicAsWinService.bat" ähnlich zu (den CLASSPATH-Eintrag benötigen Sie nur, falls Sie zusätzliche Libs einbinden wollen, beispielsweise JDBC-Treiber):
echo off SETLOCAL set CLASSPATH=C:\WebLogic\user_projects\domains\MeineDomain\config\jdbc\MeinJdbcTreiber.jar set _WL_BASIS_DIR=C:\WebLogic set _WL_SERVER_DIR=%_WL_BASIS_DIR%\wlserver set SERVER_NAME=AdminServer set DOMAIN_NAME=MeineDomain set USERDOMAIN_HOME=%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME% set PRODUCTION_MODE=false set WLS_USER=weblogic set WLS_PW=weblogic0 set JAVA_OPTIONS=-Dweblogic.Stdout="%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME%\logs\stdout.log" -Dweblogic.Stderr="%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME%\logs\stderr.log" call "%_WL_SERVER_DIR%\server\bin\installSvc.cmd" @echo. @echo Es muss die Meldung "wlsvc %DOMAIN_NAME%_%SERVER_NAME% installed" erscheinen @ENDLOCAL
Passen Sie die Einträge an Ihre Installation an und beachten Sie die Erläuterungen.
Am besten legen Sie auch gleich eine Batchdatei "deinstallWebLogicAsWinService.bat" zum Löschen des Windows-Dienstes an:
echo off SETLOCAL set DOMAIN_NAME=MeineDomain set SERVER_NAME=AdminServer set _WL_BASIS_DIR=C:\WebLogic set _WL_SERVER_DIR=%_WL_BASIS_DIR%\wlserver call "%_WL_SERVER_DIR%\server\bin\uninstallSvc.cmd" @echo. @echo Es muss die Meldung "wlsvc %DOMAIN_NAME%_%SERVER_NAME% removed" erscheinen @ENDLOCAL
Führen Sie die Batchdatei "installWebLogicAsWinService.bat" mit Admin-Rechten aus (rechte Maustaste, "Als Administrator ausführen").
Der dabei installierte Windows-Service erhält den Namen "wlsvc %DOMAIN_NAME%_%SERVER_NAME%", also z.B. "wlsvc MeineDomain_AdminServer".
Falls die Datenbank auf demselben PC läuft, muss der WebLogic verzögert gestartet werden,
damit die Datenbank fertig hochgefahren ist:
"Start | Systemsteuerung | [System und Sicherheit] | Verwaltung | Dienste"
"wlsvc MeineDomain_AdminServer"
Starttyp: "Automatisch (Verzögerter Start)"
Nach dem nächsten PC-Neustart wird der WebLogic als Dienst gestartet.
Sie können ihn auch ohne PC-Neustart starten, indem Sie betätigen:
"Start | Systemsteuerung | [System und Sicherheit] | Verwaltung | Dienste"
"wlsvc MeineDomain_AdminServer"
"Starten",
oder alternativ indem Sie ein Kommandozeilenfenster mit Admin-Rechten öffenen und ausführen:
net start "wlsvc MeineDomain_AdminServer"
Überprüfen Sie wichtige WebLogic-Konfigurationsparameter wie beispielsweise die "Maximale Heap-Größe" in der WebLogic-Console unter "MeineDomain | Umgebung | Server | AdminServer | Überwachung | Performance".
Sehen Sie sich unbedingt die Vorgabewerte für die WebLogic-Konfigurationsparameter in der Windows-Registry an, mit regedit unter:
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wlsvc MeineDomain_AdminServer\Parameters".
Achten Sie besonders auf die korrekte Konfiguration der Xmx-Werte und des CLASSPATH.
Falls sich der WebLogic nicht per Windows-Service starten lässt, sehen Sie sich die "Windows-Ereignisanzeige" (unter Start | Systemsteuerung | [System und Sicherheit] | Verwaltung | Computerverwaltung | System | Ereignisanzeige) an.
Falls Sie eine DataSource nicht wie oben beschrieben per WLST konfigurieren wollen, können Sie es wie im Folgenden beschrieben interaktiv machen.
Für einige Datenbanken, und so auch für MySQL, ist der benötigte JDBC-Treiber bereits im WebLogic-Installationspaket enthalten. In diesem Fall brauchen Sie ihn nicht gesondert zu installieren.
Falls Sie einen anderen nicht im WebLogic-Installationspaket enthaltenen JDBC-Treiber einbinden wollen (z.B. jt400.jar für AS/400): Es genügt oft nicht, diesen JDBC-Treiber einfach in das Domain-lib-Verzeichnis (z.B. C:\WebLogic\user_projects\domains\MeineDomain\lib) zu kopieren. Stattdessen müssen Sie ihn in ein anderes Verzeichnis kopieren (z.B. <MeineDomain>\config\jdbc) und den Pfad zum WebLogic-CLASSPATH hinzufügen, zum Beispiel indem Sie unter Windows in der startWebLogic.cmd als erste Zeile einfügen:
set CLASSPATH=config\jdbc\jt400.jar
Starten Sie bei laufendem WebLogic die WebLogic-Administrationskonsole über:
http://localhost:7001/console
Je nach WebLogic-Version (und Einstellung) müssen Sie eventuell in der linken Spalte oben links unter 'Change Center' auf 'Lock & Edit' klicken.
Klicken Sie in der linken Spalte unter 'Domain Structure' ('Domainstruktur') auf das '[+]' vor 'Services', das '[+]' vor 'JDBC' und auf 'Data Sources' ('Datenquellen').
Klicken Sie in der Mitte unter 'Data Sources' auf 'New' ('Neu') und geben Sie ein:
Name: | MeinMySqlDataSourceName |
JNDI Name: | jdbc/MeinDatasourceJndiName |
Database Type: | MySQL |
Database Driver: | com.mysql.jdbc.Driver |
'Next' | |
'Next' | |
Database Name: | MeineDb [anpassen!] |
Host Name: | localhost [anpassen!] |
Port: | 3306 |
Database User Name: | root |
Password: | mysqlpwd |
Confirm Password: | mysqlpwd |
'Next' | |
URL überprüfen: | jdbc:mysql://localhost:3306/MeineDb |
'Test Configuration' | |
'Next' | |
Unter 'Servers': Checkbox vor dem gewünschten Server aktivieren. | |
'Finish' |
Je nach WebLogic-Version (und Einstellung) müssen Sie eventuell in der linken Spalte auf 'Activate Changes' klicken.
Sehen Sie sich die konfigurierten Einstellungen an, je nach Installation in: ~/Tools/WebLogic1221/user_projects/domains/MeineDomain/config/jdbc/MeinMySqlDataSourceName-5723-jdbc.xml, /opt/WebLogic1221/user_projects/domains/MeineDomain/config/jdbc/MeinMySqlDataSourceName-5723-jdbc.xml bzw. C:\WebLogic\user_projects\domains\MeineDomain\config\jdbc\MeinMySqlDataSourceName-5723-jdbc.xml.
WLST-Skripte können Sie im Allgemeinen ausführen über folgende Batchdatei:
@setlocal call C:\WebLogic\wlserver\server\bin\setWLSEnv.cmd "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST-Skript.py @endlocal
Falls Sie eine (z.B. per WebLogic-Console erstellte) lauffähige WebLogic-Konfiguration haben, brauchen Sie das dieser Konfiguration entsprechende WLST-Skript nicht von Hand zu erstellen, sondern können es per configToScript()-WLST-Kommando generieren lassen, siehe folgendes Skript:
WLST-configToScript.py
loadProperties( "_WLST-configToScript.properties" ) configToScript( _WL_DOMAIN_DIR )
Die folgende Batchdatei ruft das gezeigte Skript auf und demonstriert eine Möglichkeit, wie Parameter aus der Batchdatei an das WLST-Skript weitergegeben werden können.
WLST-configToScript.bat
@title WLST-configToScript.bat rem Pfad mit Schraegstrich statt Backslash: set _WL_BASIS_DIR=C:/WebLogic set _WL_DOMAIN_NAME=MeineDomain @echo _WL_DOMAIN_DIR=%_WL_BASIS_DIR%/user_projects/domains/%_WL_DOMAIN_NAME%> _WLST-configToScript.properties @setlocal call %_WL_BASIS_DIR%\wlserver\server\bin\setWLSEnv.cmd @echo on "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST-configToScript.py @endlocal del _WLST-configToScript.properties @echo. @echo Ergebnis in: %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\config pause
Mit folgendem WLST-Skript können Sie die Konfiguration der Domain "MeineDomain" in eine Template-jar-Datei speichern:
readDomain( "C:/WebLogic/user_projects/domains/MeineDomain" ) writeTemplate( "./templates/WebLogic-Template-MeineDomain.jar" )
Umgekehrt können Sie in neuen WebLogic-Basisinstallationen mit der Template-jar-Datei die vorkonfigurierte Domain installieren:
readTemplate( "./templates/WebLogic-Template-MeineDomain.jar" ) writeDomain( "C:/WebLogic/user_projects/domains/MeineDomain" )
Sehen Sie sich die Doku zu readDomain(), writeTemplate(), readTemplate() und writeDomain() an.
Wenn Sie nicht die Flexibilität von WLST benötigen, sondern tatsächlich lediglich eine Template-jar-Datei erzeugen bzw. einspielen wollen, benötigen Sie nicht WLST, sondern können auch einfacher die pack- und unpack-Kommandos verwenden (passen Sie den Verzeichnispfade an):
C:\WebLogic\wlserver\common\bin\pack -domain=C:\WebLogic\user_projects\domains\MeineDomain -template=templates\WebLogic-Template-MeineDomain.jar -template_name="MeineDomain"
Und umgekehrt:
C:\WebLogic\wlserver\common\bin\unpack -template=templates\WebLogic-Template-MeineDomain.jar -domain=C:\WebLogic\user_projects\domains\MeineDomain
Weiteres hierzu finden Sie unter http://docs.oracle.com/cd/E12840_01/common/docs103/pack/commands.html.
JNDI (Java Naming and Directory Interface) bietet einen Namens- und Verzeichnisdienst, über den Objekte und Dienste gefunden und verfügbar gemacht werden.
Besonders zu Beginn kann es sehr hilfreich sein, die genauen Namen aller JNDI-Einträge anzeigen zu lassen. Zum Beispiel der Name für das 'UserTransaction'-Objekt heißt bei den verschiedenen Java EE Application Servern unterschiedlich.
Führen Sie hierfür das Testprogramm unter
jee-jndi.htm#Auslesen-Namen-im-JNDI aus
Falls Sie wie oben beschrieben eine Datasource eingerichtet haben, wird diese angezeigt (z.B. als jdbc: ... jdbc/MeinDatasourceJndiName).
Installieren Sie ein aktuelles Java SE JDK und Ant.
Legen Sie für eine Projektverzeichnisstruktur folgende in eckigen Klammern dargestellten Verzeichnisse an:
[\MeinWorkspace] `- [MeineWebApp] |- [lib] | `- *servlet*.jar |- [src] | |- [meinjavabeanpkg] | |- [meinservletpkg] | `- [meinsessionbeanpkg] `- [webapp] `- [WEB-INF] `- [lib]
Sie können diese Verzeichnisstruktur und die meisten der im Folgenden vorgestellten Dateien auch downloaden (außer den Libs).
Kopieren Sie die '*servlet*.jar'-Lib (z.B. servlet.jar, servlet-api.jar, javax.servlet_1.0.0.0_2-5.jar oder javax.servlet.javax.servlet-api.jar)
in das '<Projektverzeichnis>\lib'-Verzeichnis.
Je nach Java EE Application Server finden Sie diese Lib in Verzeichnissen ähnlich zu:
Oracle WebLogic: | C:\WebLogic\modules oder C:\WebLogic\oracle_common\modules |
IBM WebSphere: | IbmWebSphere\AppServer\deploytool\itp\plugins\org.eclipse.tomcat_4.1.30.1 |
Tomcat: | Tomcat\common\lib |
Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinservletpkg' die folgende Servlet-Datei 'MeinServlet.java':
package meinservletpkg; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MeinServlet extends HttpServlet { public void doGet( HttpServletRequest requ, HttpServletResponse resp ) throws ServletException, IOException { resp.setContentType( "text/html" ); PrintWriter out = resp.getWriter(); out.println( "<html>" ); out.println( "Hallo, mein erstes Servlet meldet sich." ); out.println( "</html>" ); out.close(); } }
Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinjavabeanpkg' die folgende JavaBean-Datei 'MeineJavaBean.java':
package meinjavabeanpkg; import java.text.SimpleDateFormat; import java.util.Date; public class MeineJavaBean { public String getDateString() { return (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h"; } }
Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende Start-Index-Datei 'index.jsp':
<html> <head><title>Meine Start-Seite</title></head> <body> <h1>Meine Start-Seite (index.jsp)</h1> <p><a href="helloservlet">helloservlet</a></p> <p><a href="HelloJSP.jsp">HelloJSP.jsp</a></p> <p><a href="HelloJavaBean.jsp">HelloJavaBean.jsp</a></p> <p><a href="HelloDB.jsp">HelloDB.jsp</a></p> </body> </html>
Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloJSP.jsp':
<%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.util.Date" %> <html> <head><title>Hello JSP</title></head> <body> <h2>Hallo, meine erste JSP-Seite meldet sich.</h2> <%= request.getRemoteHost() %>, <%= (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h" %> </body> </html>
Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloJavaBean.jsp':
<%@ page import="meinjavabeanpkg.MeineJavaBean" %> <html> <head><title>Hello JavaBean</title></head> <body> <h2>Hallo, meine JSP-Seite mit JavaBean meldet sich.</h2> <%= request.getRemoteHost() %><br> <% MeineJavaBean jb = new MeineJavaBean(); out.println( jb.getDateString() ); %> </body> </html>
Voraussetzung für die folgende JSP-Seite ist die Einrichtung einer DataSource im Java EE Application Server, zum Beispiel so wie beschrieben für Oracle WebLogic und GlassFish (ansonsten können Sie auf diese JSP-Seite auch verzichten).
Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloDB.jsp':
<%@ page import="java.sql.*" %> <%@ page import="java.util.*" %> <%@ page import="javax.naming.*" %> <%@ page import="javax.sql.DataSource" %> <%@ page import="javax.transaction.*" %> <html> <head><title>Hello DB</title></head> <body> <h2>Hallo, meine JSP-Seite mit Datenbank-Zugriff meldet sich.</h2> <% Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup( "jdbc/MeinDatasourceJndiName" ); Connection cn = null; Statement st = null; ResultSet rs = null; try { cn = ds.getConnection(); st = cn.createStatement(); rs = st.executeQuery( "Select * from MeineTestTabelle" ); if( rs.next() ) out.println( "Ergebnis: " + rs.getString( 1 ) + "<br>" ); out.println( cn.getMetaData().getDatabaseProductName() + ", " ); out.println( cn.getMetaData().getDatabaseProductVersion() + "<br>" ); } finally { try { if( null != rs ) rs.close(); } catch( Exception ex ) {/*ok*/} try { if( null != st ) st.close(); } catch( Exception ex ) {/*ok*/} try { if( null != cn ) cn.close(); } catch( Exception ex ) {/*ok*/} } %> </body> </html>
Passen Sie 'MeinDatasourceJndiName' und 'MeineTestTabelle' an Ihre DataSource an.
Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp\WEB-INF' die folgende Webanwendungs-Konfigurations-Datei 'web.xml':
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'> <web-app> <display-name>Meine WebApp</display-name> <servlet> <servlet-name>MeinServletName</servlet-name> <servlet-class>meinservletpkg.MeinServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MeinServletName</servlet-name> <url-pattern>/helloservlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
Speichern Sie im Verzeichnis '<Projektverzeichnis>' die folgende Ant-Datei 'build.xml':
<project name="MeinWebAppProjekt" default="usage"> <!-- Overwrite the following props in a 'build.properties' file: <property name="deploy.dir" value="..." /> --> <property file="build.properties" /> <property name="app.name" value="MeineWebApp" /> <property name="deploy.dir" value="dist" /> <property name="dist.dir" value="dist" /> <property name="lib.dir" value="lib" /> <property name="src.dir" value="src" /> <property name="webapp.dir" value="webapp" /> <property name="WEBINF.dir" value="${webapp.dir}/WEB-INF" /> <path id="compile.classpath"> <fileset dir="${lib.dir}" includes="*.jar" /> <fileset dir="${WEBINF.dir}/lib" /> <pathelement path="${WEBINF.dir}/classes" /> </path> <target name="usage"> <echo message="Availiable Targets" /> <echo message=" clean : Delete ${WEBINF.dir}/classes, ${dist.dir}" /> <echo message=" compile : Compile from ${src.dir} to ${WEBINF.dir}/classes" /> <echo message=" create-war: Create ${dist.dir}/${app.name}.war" /> <echo message=" deploy-war: Copy ${dist.dir}/${app.name}.war to ${deploy.dir}" /> </target> <target name="clean" description="Delete ${WEBINF.dir}/classes, ${dist.dir}"> <delete dir="${WEBINF.dir}/classes" /> <delete dir="${dist.dir}" /> </target> <target name="compile" description="Compile from ${src.dir} to ${WEBINF.dir}/classes"> <mkdir dir="${WEBINF.dir}/lib" /> <mkdir dir="${WEBINF.dir}/classes" /> <javac srcdir="${src.dir}" destdir="${WEBINF.dir}/classes"> <classpath refid="compile.classpath" /> </javac> <copy todir="${WEBINF.dir}/classes"> <fileset dir="${src.dir}" excludes="**/*.java" /> </copy> </target> <target name="create-war" depends="compile" description="Create ${dist.dir}/${app.name}.war"> <mkdir dir="${dist.dir}" /> <war destfile="${dist.dir}/${app.name}.war" webxml="${WEBINF.dir}/web.xml"> <fileset dir="${webapp.dir}" includes="**/*.*" excludes="**/web.xml, **/servlet*.jar, **/junit*.jar" /> </war> </target> <target name="deploy-war" depends="create-war" description="Copy ${dist.dir}/${app.name}.war to ${deploy.dir}"> <copy todir="${deploy.dir}" preservelastmodified="true"> <fileset dir="${dist.dir}" includes="${app.name}.war" /> </copy> </target> </project>
Falls Ihr Java EE Application Server für Auto-Deployment konfiguriert ist:
Speichern Sie im Verzeichnis
'<Projektverzeichnis>'
eine Properties-Datei 'build.properties' mit der Angabe des Auto-Deployment-Verzeichnisses.
Für Oracle WebLogic zum Beispiel so:
deploy.dir=C:/WebLogic/user_projects/domains/MeineDomain/autodeploy
Für GlassFish V2 zum Beispiel so:
deploy.dir=C:/GlassFish/glassfish/domains/domain1/autodeploy
Für JBoss zum Beispiel so:
deploy.dir=/JBoss/server/default/deploy
Ihr Projektverzeichnis muss jetzt so aussehen (überprüfen Sie es mit "tree /F", dist und classes erscheinen erst nach dem 'Ant'-Lauf):
[\MeinWorkspace] `- [MeineWebApp] |- [dist] | `- ... |- [lib] | `- *servlet*.jar |- [src] | |- [meinjavabeanpkg] | | `- MeineJavaBean.java | `- [meinservletpkg] | `- MeinServlet.java |- [webapp] | |- [WEB-INF] | | |- [classes] | | | `- ... | | |- [lib] | | `- web.xml | |- HelloDB.jsp | |- HelloJavaBean.jsp | |- HelloJSP.jsp | `- index.jsp |- build.properties `- build.xml
Falls Ihr Java EE Application Server für Auto-Deployment konfiguriert ist:
Öffnen Sie ein Kommandozeilenfenster und geben Sie die folgenden Kommandos ein:
cd \MeinWorkspace\MeineWebApp
ant deploy-war
Im Auto-Deployment-Verzeichnis (z.B. 'C:\WebLogic\user_projects\domains\MeineDomain\autodeploy') wird das Webarchiv 'MeineWebApp.war' generiert und vom Java EE Application Server automatisch deployt.
Falls Ihr Java EE Application Server nicht für Auto-Deployment konfiguriert ist:
Öffnen Sie ein Kommandozeilenfenster und geben Sie die folgenden Kommandos ein:
cd \MeinWorkspace\MeineWebApp
ant create-war
Im '<Projektverzeichnis>\dist'-Verzeichnis wird das Webarchiv 'MeineWebApp.war' generiert.
Deployen Sie diese .war-Datei über die Administrationskonsole des Java EE Application Servers, zum Beispiel für Oracle WebLogic über 'http://localhost:7001/console'.
Testen Sie Ihre Webanwendung: Klicken Sie für die einzelnen Tests nacheinander auf die Links der Startseite:
Oracle WebLogic: | http://localhost:7001/MeineWebApp |
GlassFish V2: | http://localhost:8080/MeineWebApp |
Andere Java EE Application Server: | Eventuell andere Portnummer einsetzen |
Falls Sie beim Compilieren eine Fehlermeldung ähnlich zu '...\MeineWebApp\src\meinservletpkg\MeinServlet.java: package javax.servlet does not exist' erhalten, fehlt die '*servlet*.jar'-Library.
Falls Sie eine Fehlermeldung ähnlich zu 'javax.servlet.ServletException: javax.naming.NameNotFoundException: HelloWorld not found' erhalten, erwartet Ihr Java EE Application Server einen anderen JNDI-Namen. Sehen Sie mit dem JNDI-Auslese-Programm nach, welchen JNDI-Namen Ihr Java EE Application Server vergeben hat.
Falls Sie beim Application-Server-Deployment auf der Serverkonsole eine Fehlermeldung ähnlich zu 'java.lang.UnsupportedClassVersionError: Bad version number in .class file' erhalten, müssen Sie die Webanwendung mit derselben Java-Version kompilieren, die Ihr Java EE Application Server verwendet. Das kann für Oracle WebLogic zum Beispiel folgendermaßen erfolgen (bitte Pfade anpassen):
cd \MeinWorkspace\MeineWebApp
set JAVA_HOME=C:\Program Files\Java\jrockit-jdk1.6.0_45-R28.2.7-4.1.0
set PATH=%JAVA_HOME%\bin;%PATH%
ant clean deploy-war
Außer dem beschriebenen Auto-Deployment und dem Deployment über die Administrationskonsole bietet WebLogic noch weitere Möglichkeiten zum Deployment, zum Beispiel per WLST oder per weblogic.Deployer, siehe hierzu: http://docs.oracle.com/cd/E11035_01/wls100/deployment/deploy.html und http://docs.oracle.com/cd/E13222_01/wls/docs103/deployment/wldeployer.html.
Für dieses Beispiel können Sie folgendermaßen mit weblogic.Deployer deployen:
@setlocal
call C:\WebLogic\wlserver\server\bin\setWLSEnv.cmd
"%JAVA_HOME%\bin\java" weblogic.Deployer -username weblogic -password weblogic0 -name MeineWebApp -deploy dist\MeineWebApp.war
"%JAVA_HOME%\bin\java" weblogic.Deployer -username weblogic -password weblogic0 -listapps
@endlocal
Für ein Undeployment ersetzen Sie -deploy durch -undeploy.
Falls Sie von einer älteren WebLogic-Version auf WebLogic 12.2.1 migrieren wollen, sollten Sie Folgendes überprüfen:
Beispielsweise in Servlets konnten in früheren WebLogic-Versionen problemlos eigene Threads gestartet werden und darin beispielsweise nach einem JNDI-Lookup auf den JPA-EntityManager dieser normal verwendet werden ("Container-managed EntityManager" mit "JTA-verwalteten Transaktionen").
Das geht ab WebLogic 12.2.1 nicht mehr so einfach. Dies bedeutet auch, dass einige Java-8-Features nur eingeschränkt nutzbar sind. In der WebLogic-12.2.1-What's-New-Doku schreibt Oracle:
"Oracle WebLogic Server 12.2.1 does not support applications using the new Java SE 8 fork/join and parallel streams features. Avoid these features when building Oracle WebLogic Server 12.2.1 applications using Java SE 8. The reason for this restriction is that the threads used by the fork/join thread pool will not be WebLogic Server managed threads. Any of the work performed in these threads may not be able to make use of WebLogic Server or Java EE facilities because the state of these threads, including security and transaction state, may not be created properly. Further, these threads will not be controlled by WebLogic Server Work Manager thread management facilities, possibly resulting in excessive thread usage."
Um "WebLogic Server managed Threads" mit vollständiger Unterstützung erstellen zu können, müssen Sie ManagedThreadFactory (bzw. ManagedExecutorService) aus dem javax.enterprise.concurrent-api verwenden. Statt beispielsweise der Zeile:
new Thread( new MeinRunnable() ).start();
schreiben Sie:
ManagedThreadFactory mtf = (ManagedThreadFactory) (new InitialContext()).lookup( "java:comp/DefaultManagedThreadFactory" );
mtf.newThread( new MeinRunnable() ).start();
Indizien dafür, dass diese Maßnahme erforderlich ist, können beispielsweise folgende Exceptions sein:
com.sun.jdi.InvocationException occurred invoking method
java.lang.NullPointerException
at weblogic.persistence.CICScopedEMProvider.getEMForCurrentCIC(CICScopedEMProvider.java:35)
at weblogic.persistence.TransactionalEntityManagerProxyImpl.getPersistenceContext(TransactionalEntityManagerProxyImpl.java:122)
javax.persistence.TransactionRequiredException: Cannot call methods requiring a transaction if the EntityManager has not been joined to the current transaction.
Siehe hierzu auch: What's New in Oracle WebLogic Server 12.2.1, Concurrency Utilities support in WebLogic Server 12.2.1, ManagedThreadFactory, Configuring Concurrent Managed Objects, JSR 220, Java Persistence API, Container-managed Persistence Contexts.
Die WebLogic RESTful Management Services sind eine praktische Hilfe insbesondere während der Entwicklung. Konkrete Beispiele finden Sie beispielsweise unter deploy-mit-curl, WebLogic-REST-Management-Kommandos und Deploying remotely with WebLogic REST (Buttso).
Falls Sie bei der Verwendung der WebLogic RESTful Management Services
eine Fehlermeldungen ähnlich zu "404 Not Found" erhalten, dann überprüfen Sie,
ob die WebLogic-RESTful-Management-Services aktiviert sind:
Klicken Sie in der WebLogic-Console Folgendes an:
im "Domainstruktur"-Fenster oben links auf den Domain-Namen klicken | in der Mitte auf: Konfiguration | direkt darunter auf: Allgemein | ganz unten auf: Erweitert |
fast ganz unten auf: RESTful Management-Services aktivieren (= Enable RESTful Management Services) | Speichern.
Je nach Installationsart müssen Sie eventuell vorher ganz oben links auf "Sperren und bearbeiten" klicken.
Wenn die WebLogic-Console meldet:
"Alle Änderungen wurden aktiviert. Allerdings ist ein Neustart für 1 Element(e) erforderlich, damit die Änderungen wirksam werden.",
dann starten Sie den WebLogic neu und überprüfen erneut, ob die Aktivierung übernommen wurde.
Falls Sie bei der Verwendung der WebLogic RESTful Management Services eine der folgenden Fehlermeldungen erhalten:
Failed to receive SOCKS4 connect request ack
Internal Server Error
REST encountered the following error: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class weblogic.management.rest.wls.model.LegacyRestCollectionResponseBody, genericType=org.glassfish.admin.rest.model.RestCollectionResponseBody<weblogic.management.rest.wls.model.Deployment>
Dann versuchen Sie wahrscheinlich die WebLogic RESTful Management Services in der Developer-Version zu verwenden. Sie benötigen aber hierfür die Generic-Version.
Falls Sie Node-Manager, Admin-WebLogic und Managed-WebLogic-Server installiert haben, und falls Sie in einem WLST-Skript, oder beim Versuch, einen Managed-Server manuell über die WebLogic-Admin-Webkonsole zu starten, eine der folgenden Fehlermeldungen erhalten:
Warnung: Für den Server ... ist der mit dem Rechner ... verknüpfte Node Manager nicht verfügbar.
Warning: For server ... the Node Manager associated with machine ... is not reachable.
weblogic.management.scripting.ScriptException: Error occurred while performing start : None of the servers in the cluster ... could be started. Please check if the Node Manager is up and running.
Dann prüfen Sie Folgendes:
Beachten Sie die oben erläuterte in aktuellen WebLogic-Versionen geänderte Default-Node-Manager-Art "per Domain Node Manager".
Überprüfen Sie (unter Linux mit: "ps -ef | grep -i WebLogic"), ob Node-Manager, Admin-WebLogic und Managed-WebLogic-Server laufen. Überprüfen Sie auch die Verwendung des Node-Manager-Ports über "netstat -an | grep 5556".
Überprüfen Sie alle Log-Dateien.
Öffnen Sie die WebLogic-Admin-Webkonsole und klicken Sie auf:
"Umgebung | Rechner | <MeineMaschine> | Überwachung | Node Manager Status" bzw.
"Environment | Machines | <MeineMaschine> | Monitoring | Node Manager Status".
Eventuell finden Sie unter "Status" und "Problembeschreibung" eine Fehlerbeschreibung.
Beispielsweise wird eine SSLException manchmal nicht in Logfiles gemeldet, sondern nur hier angezeigt.
Falls es sich um eine javax.net.ssl.SSLException oder javax.net.ssl.SSLKeyException handelt:
Kontrollieren Sie die Einstellungen in der WebLogic-Admin-Webkonsole unter "Umgebung | Server | <MeinServer> | Konfiguration | Keystores und SSL".
Kontrollieren Sie die Identity- und Trust-Zertifikate, z.B. per "keytool -list -v -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase" und "keytool -list -v -keystore DemoTrust.jks -storepass DemoTrustKeyStorePassPhrase".
Falls Sie die DemoTrust- und DemoIdentity-Keystores verwenden: Beachten Sie, dass sich DemoTrust.jks weiterhin im {WL_HOME}/server/lib-Verzeichnis befindet, aber DemoIdentity.jks seit der WebLogic-Version 12.1.2 im {DOMAIN_HOME}/security-Verzeichnis während der Domain-Generierung erzeugt wird.
Stellen Sie sicher, dass nmEnroll() korrekt ausgeführt wurde.
Eventuell finden Sie den Fehler leichter, wenn Sie JAVA_OPTION um folgende Parameter erweitern:
Beispielsweise in startNodeManager.sh:
"-Dssl.debug=true -Dweblogic.nodemanager.sslHostNameVerificationEnabled=false -Dweblogic.security.SSL.enforceConstraints=off".
Und in startWeblogic.sh:
"-Dssl.debug=true -Dweblogic.security.SSL.ignoreHostnameVerification=true -Dweblogic.security.SSL.enforceConstraints=off".
Falls Sie bei der Kommunikation zwischen Node-Manager und Admin-Server kein SSL verwenden wollen, und dazu an nmConnect() den Parameter nmType=plain übergeben, beachten Sie, dass Sie zusätzlich in der {NODE_MANAGER_HOME}/nodemanager.properties setzen müssen: SecureListener=false, siehe nmConnect() / nmType.
Sehen Sie sich an: Administering Security, Configuring SSL, SSL Debugging und Administering Node Manager.
Dies ist eigentlich kein direktes WebLogic-Kompatibilitätsproblem, sondern ein Java-7-Kompatibilitätsproblem. Aber es soll hier ebenfalls aufgeführt werden, da mit einem Update auf WebLogic 12.x häufig gleichzeitig auf eine neuere Java-Version gewechselt wird.
In Java 7 wurde der Default-Sort-Algorithmus von MergeSort zu TimSort umgestellt. Bei vollständig korrekter Programmierung und Einhaltung des "Comparison Contracts" ist das unproblematisch. Aber kleinere Ungenauigkeiten bei der Implementierung der Comparator.compare()- bzw. Comparable.compareTo()-Methode fallen ab Java 7 auf und führen zu der Exception:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
Zum "Comparison Contract" siehe: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html.
Eine häufige Verletzung des "Comparison Contracts" betrifft die Regel:
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
Diese Regel wird insbesondere dann gerne verletzt, wenn Objekte mit null-Attributen verglichen werden. Abhängig davon, welche Seite das null-Attribut enthält, darf nicht in beiden Fällen dasselbe Vorzeichen returniert werden, sondern es muss mal -1 und mal 1 returniert werden, beispielsweise so:
public <T extends Comparable<Object>> int compareIntern( T o1, T o2 ) { if( o1 == o2 ) { return 0; } else if( o1 == null ) { return -1; } else if( o2 == null ) { return 1; } return o1.compareTo( o2 ); }
Ab der WebLogic-Version 12.1.1 hat sich die Default-JAXB-Implementierung geändert. Der Default ist jetzt der "EclipseLink MOXy Provider". Dies kann zu zwei Problemen führen:
So ermitteln Sie, welcher JAXB-Provider verwendet wird (MeinEntityType.java ist die zu konvertierende Java-Klasse):
String s = javax.xml.bind.JAXBContext.newInstance(MeinEntityType.class).getClass().toString();
Um die genannten Probleme zu vermeiden, gibt es zwei alternative Optionen:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory(Voraussetzung ist natürlich, dass diese Klasse im CLASSPATH liegt).
com.sun.xml.ws.db.glassfish.JAXBRIContextFactoryund META-INF/services/javax.xml.bind.JAXBContext mit dem Inhalt
com.sun.xml.bind.v2.ContextFactoryund diese beiden Dateien werden eingetragen in die META-INF/weblogic-application.xml:
... <prefer-application-resources> <resource-name>META-INF/services/com.sun.xml.ws.spi.db.BindingContextFactory</resource-name> <resource-name>META-INF/services/javax.xml.bind.JAXBContext</resource-name> </prefer-application-resources> ...
Falls es Ihnen lediglich auf die Vermeidung unnötiger Namespace-Angaben ankommt, sollten Sie sich ansehen: Remove namespace prefix while JAXB marshalling und How to marshal without a namespace?
Falls Sie während der Entwicklung bei häufigen leicht unterschiedlichen Deployments im WebLogic eine Exception erhalten ähnlich zu:
java.lang.NoClassDefFoundError: org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl
Dann ist eventuell im JAXP Factories Cache eine unerwünschte Implementation geladen worden. In diesem Fall kann ein einfacher WebLogic-Neustart helfen.
Falls Sie weiterhin diese Exception erhalten, müssen Sie die Classloader-Reihenfolge untersuchen.
Die Classloader-Reihenfolge ist bei den verschiedenen WebLogic-Versionen mehrmals geändert worden. Erläuterungen zum WebLogic-Classloading finden Sie unter http://docs.oracle.com/cd/E21764_01/web.1111/e13706/classloading.htm. Falls Sie auf Probleme mit unterschiedlichen Versionen eigener und bereits im WebLogic (z.B. in 'weblogic.jar') vorhandenen Bibliotheken stoßen (z.B. mit "org.apache.*" oder "javax.jws.*"), dann versuchen Sie je nach WebLogic-Version und je nach Anwendung bzw. Deployment (WAR oder EAR) einen der folgenden Vorschläge, damit bestimmte Klassen aus dem ApplicationContext und nicht aus dem ServerContext geladen werden. Bitte beachten Sie: Die im Folgenden eingesetzten Package-Namen sind nur willkürliche Beispiele, die Sie für Ihre Anwendung ersetzen müssen.
Damit Sie die richtigen Einträge für <prefer-application-packages> finden, kann das Classloader Analysis Tool (CAT) eine gute Hilfe sein, siehe: http://docs.oracle.com/cd/E21764_01/web.1111/e13706/classloading.htm#BABHJGJJ. Oder Sie implementieren eine Diagnose-Seite wie unter JSF: Implementierungen, Versionen, Session, Classpath, Libs etc. anzeigen demonstriert.
Erstellen Sie eine Datei 'WEB-INF/weblogic.xml':
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd"> <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app>
Weiteres zur weblogic.xml finden Sie unter: http://docs.oracle.com/cd/E23943_01/web.1111/e13712/weblogic_xml.htm.
Erstellen Sie eine Datei 'WEB-INF/weblogic.xml':
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd"> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.apache.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
Weiteres zur weblogic.xml finden Sie unter: http://docs.oracle.com/cd/E23943_01/web.1111/e13712/weblogic_xml.htm.
Fügen Sie Ihrer .ear-Datei eine 'META-INF/weblogic-application.xml' hinzu mit folgendem Inhalt (ersetzen Sie "org.apache.*" durch Ihre Problemklassen und fügen Sie weitere '<prefer-application-packages>'-Einträge hinzu) (den '<application-param>'-Teil können Sie natürlich auch weglassen):
<?xml version="1.0" encoding="UTF-8"?> <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90"> <application-param> <param-name>webapp.encoding.default</param-name> <param-value>UTF-8</param-value> </application-param> <prefer-application-packages> <package-name>org.apache.*</package-name> <package-name>org.springframework.*</package-name> <package-name>antlr.*</package-name> </prefer-application-packages> </weblogic-application>
Falls Sie Probleme beim Zugriff auf einen WebLogic-Server von einem externen Client aus haben (z.B. mit unterschiedlichen Java-Versionen), sehen Sie sich folgende auf Clientseite anwendbaren Kommandozeilenparameter an:
-Dweblogic.jndi.enableDefaultUser=true (Erläuterung siehe hier)
-Dsun.lang.ClassLoader.allowArraySyntax=true (Erläuterung siehe hier und hier)
Letzterer insbesondere, wenn Sie folgende Fehlermeldung erhalten:
javax.naming.CommunicationException [Root exception is java.rmi.UnmarshalException:
failed to unmarshal class weblogic.security.acl.internal.AuthenticatedUser; nested exception is:
java.io.StreamCorruptedException: invalid type code: 31]
Falls Sie den WebLogic-Server mit einer Oracle-Datenbank betreiben und während der Entwicklung zur Erforschung von Problemen zwischen der Anwendung und der Datenbank die übertragenen SQL-Kommandos tracen wollen:
.level=FINE oracle.jdbc.level=FINE oracle.jdbc.handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINE java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
Genauere Infos hierzu finden Sie unter: Oracle DB, Diagnosability in JDBC, Capture the sql statements issued by the JDBC Drivers und Enabling the JDBC driver level logging.
Mit den Monitoring-Tools für WebLogic können der Speicherverbrauch, GC-Aktivitäten, Threads, MBeans, die VM u.a. des WebLogic beobachtet werden.
Hilfreich kann sein, dass im laufenden Betrieb Snapshots von Thread-Stacktraces einzelner Threads erstellt werden können. Wenn man dies vielleicht zehnmal macht, ist die Wahrscheinlichkeit groß, auf Methoden mit großem Zeitverbrauch zu stoßen.
Falls der Zugriff remote über JMX erfolgen soll, muss der WebLogic 10 (mit JRockit-JDK) mit korrekten Parametern gestartet werden, siehe hierzu: Startparameter.
JRockit Mission Control kann mit folgendem Kommando gestartet werden:
"%JAVA_HOME%\bin\jrmc.exe"
Falls der Zugriff remote über JMX erfolgen soll, muss der WebLogic 10 (mit JRockit-JDK) mit korrekten Parametern gestartet werden, siehe hierzu: Startparameter.
"%JAVA_HOME%\bin\jconsole.exe"