如何将 lib 包含到我的嵌入式 OpenLiberty jar 中?
How can I include lib into my embedded OpenLiberty jar?
我正在尝试在我的 OpenLiberty 应用程序中设置 h2 数据库配置。
您可以在我的 Github account 中找到该项目
我使用 maven 配置文件 OpenLiberty 构建嵌入式 jar。
<groupId>net.wasdev.wlp.maven.plugins</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<configuration>
<assemblyArtifact>
<groupId>io.openliberty</groupId>
<artifactId>openliberty-runtime</artifactId>
<version>${version.openliberty}</version>
<type>zip</type>
</assemblyArtifact>
<serverName>GettingStartedServer</serverName>
<stripVersion>true</stripVersion>
<configFile>src/main/liberty/config/server.xml</configFile>
<looseApplication>true</looseApplication>
<installAppPackages>project</installAppPackages>
<packageFile>${package.file}</packageFile>
<include>${packaging.type}</include>
<bootstrapProperties>
<default.http.port>8080</default.http.port>
<default.https.port>443</default.https.port>
<app.context.root>${project.name}</app.context.root>
</bootstrapProperties>
</configuration>
构建将提供一个 Jar,我可以在以下文件夹中找到我的 war 应用程序:
/wlp/usr/servers/GettingStartedServer/dropins/simple-microservice.war
在 war 里面有 H2 驱动程序 /WEB-INF/lib/h2-1.4.199.jar
我的 persistence.xml
看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="BOOK_PU" transaction-type="JTA">
<jta-data-source>jdbc/bookjpadatasource</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/sql/create.sql" />
<property name="javax.persistence.sql-load-script-source" value="META-INF/sql/import.sql" />
<property name="show_sql" value="true"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
</properties>
</persistence-unit>
</persistence>
和 server.xml
<server description="Sample Liberty server">
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>cdi-2.0</feature>
<feature>jpa-2.2</feature>
</featureManager>
<applicationManager autoExpand="true" />
<quickStartSecurity userName="admin" userPassword="adminpwd" />
<keyStore id="defaultKeyStore" password="mpKeystore" />
<logging traceSpecification="com.ibm.ws.microprofile.health.*=all" />
<httpEndpoint host="*" httpPort="${default.http.port}"
httpsPort="${default.https.port}" id="defaultHttpEndpoint"/>
<variable name="io_openliberty_guides_system_inMaintenance" value="false"/>
<!-- H2 Library Configuration -->
<library id="H2JDBCLib">
<fileset dir="${server.config.dir}/lib" includes="h2-1.4.199.jar"/> <=== HERE
</library>
<!-- Datasource Configuration -->
<dataSource id="h2test" jndiName="jdbc/bookjpadatasource">
<!-- Define the DataSource class names on the <jdbcDriver> element -->
<jdbcDriver
javax.sql.XADataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.ConnectionPoolDataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.DataSource="org.h2.jdbcx.JdbcDataSource"
libraryRef="H2JDBCLib"/>
<!-- set the connection URL on the <properties> element.
this corresponds to the setURL() method on H2's JdbcDataSource class.
you may also list any properties here that have a corresponding setXXX method on H2's JdbcDataSource class -->
<properties URL="jdbc:h2:mem:testdb"/>
</dataSource>
</server>
`
当我启动我的应用程序时:
java -jar target/simple-microservice-1.0-SNAPSHOT.jar
我得到一个 ClassNotFoundException:
[baptiste@DESKTOP-FUI7H3K simple-microservice]$ java -jar target/simple-microservice-1.0-SNAPSHOT.jar <br/>
Extraction des fichiers dans /home/baptiste/wlpExtract/simple-microservice-1.0-SNAPSHOT_8298781231136/wlp<br/>
Tous les fichiers du produit ont été extraits.<br/>
Lancement de GettingStartedServer (Open Liberty 19.0.0.9/wlp-1.0.32.cl190920190905-0148) sur OpenJDK 64-Bit Server VM, version 1.8.0_222-b10 (fr_FR)<br/>
[AUDIT ] CWWKE0001I: Le serveur GettingStartedServer a été lancé.<br/>
[AUDIT ] CWWKZ0058I: Recherche d'applications dans dropins.<br/>
[ERROR ] CWWKZ0005E: Le serveur n'est pas configuré pour traiter la ressource à l'emplacement /home/baptiste/wlpExtract/simple-microservice-1.0-SNAPSHOT_8298781231136/wlp/usr/servers/GettingStartedServer/dropins/h2-1.4.199.jar.<br/>
[ERROR ] CWWKE0701E: FrameworkEvent ERROR org.osgi.framework.ServiceException: Exception in com.ibm.ws.resource.internal.ResourceFactoryTrackerData.getService()<br/>
at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:226)<br/>
at [internal classes]<br/>
Caused by: java.lang.RuntimeException: java.sql.SQLNonTransientException: DSRA4000E: Aucune implémentation de org.h2.jdbcx.JdbcDataSource n'a été trouvée pour dataSource[h2test] avec la bibliothèque H2JDBCLib. Il se peut que le nom ou l'emplacement des fichiers JAR du pilote JDBC soit incorrect ou inaccessible. Recherche dans : []. Recherche sous les packages : [org.h2.jdbcx].<br/>
at com.ibm.ws.resource.internal.ResourceFactoryTrackerData.getService(ResourceFactoryTrackerData.java:122)<br/>
... 1 more<br/>
Caused by: java.sql.SQLNonTransientException: DSRA4000E: Aucune implémentation de org.h2.jdbcx.JdbcDataSource n'a été trouvée pour dataSource[h2test] avec la bibliothèque H2JDBCLib. Il se peut que le nom ou l'emplacement des fichiers JAR du pilote JDBC soit incorrect ou inaccessible. Recherche dans : []. Recherche sous les packages : [org.h2.jdbcx].<br/>
at com.ibm.ws.jdbc.internal.JDBCDriverService.classNotFound(JDBCDriverService.java:223)<br/>
... 1 more<br/>
<b>Caused by: java.lang.ClassNotFoundException: org.h2.jdbcx.JdbcDataSource</b><br/>
at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:546)<br/>
... 1 more<br/>
我想我的错误来自我的 server.xml
在这一行:
<fileset dir="${server.config.dir}/lib" includes="h2-1.4.199.jar"/>
或者在 OpenLiberty 插件配置中
你对我纠正这个问题有什么建议?
谢谢
server.config.dir
环境变量指向
/wlp/usr/servers/GettingStartedServer/
如果您将 H2 jar 移动到以下位置以匹配配置,那么它应该可以工作:
/wlp/usr/servers/GettingStartedServer/lib/h2-1.4.199.jar
我正在尝试在我的 OpenLiberty 应用程序中设置 h2 数据库配置。
您可以在我的 Github account 中找到该项目
我使用 maven 配置文件 OpenLiberty 构建嵌入式 jar。
<groupId>net.wasdev.wlp.maven.plugins</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<configuration>
<assemblyArtifact>
<groupId>io.openliberty</groupId>
<artifactId>openliberty-runtime</artifactId>
<version>${version.openliberty}</version>
<type>zip</type>
</assemblyArtifact>
<serverName>GettingStartedServer</serverName>
<stripVersion>true</stripVersion>
<configFile>src/main/liberty/config/server.xml</configFile>
<looseApplication>true</looseApplication>
<installAppPackages>project</installAppPackages>
<packageFile>${package.file}</packageFile>
<include>${packaging.type}</include>
<bootstrapProperties>
<default.http.port>8080</default.http.port>
<default.https.port>443</default.https.port>
<app.context.root>${project.name}</app.context.root>
</bootstrapProperties>
</configuration>
构建将提供一个 Jar,我可以在以下文件夹中找到我的 war 应用程序:
/wlp/usr/servers/GettingStartedServer/dropins/simple-microservice.war
在 war 里面有 H2 驱动程序 /WEB-INF/lib/h2-1.4.199.jar
我的 persistence.xml
看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="BOOK_PU" transaction-type="JTA">
<jta-data-source>jdbc/bookjpadatasource</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/sql/create.sql" />
<property name="javax.persistence.sql-load-script-source" value="META-INF/sql/import.sql" />
<property name="show_sql" value="true"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
</properties>
</persistence-unit>
</persistence>
和 server.xml
<server description="Sample Liberty server">
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>cdi-2.0</feature>
<feature>jpa-2.2</feature>
</featureManager>
<applicationManager autoExpand="true" />
<quickStartSecurity userName="admin" userPassword="adminpwd" />
<keyStore id="defaultKeyStore" password="mpKeystore" />
<logging traceSpecification="com.ibm.ws.microprofile.health.*=all" />
<httpEndpoint host="*" httpPort="${default.http.port}"
httpsPort="${default.https.port}" id="defaultHttpEndpoint"/>
<variable name="io_openliberty_guides_system_inMaintenance" value="false"/>
<!-- H2 Library Configuration -->
<library id="H2JDBCLib">
<fileset dir="${server.config.dir}/lib" includes="h2-1.4.199.jar"/> <=== HERE
</library>
<!-- Datasource Configuration -->
<dataSource id="h2test" jndiName="jdbc/bookjpadatasource">
<!-- Define the DataSource class names on the <jdbcDriver> element -->
<jdbcDriver
javax.sql.XADataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.ConnectionPoolDataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.DataSource="org.h2.jdbcx.JdbcDataSource"
libraryRef="H2JDBCLib"/>
<!-- set the connection URL on the <properties> element.
this corresponds to the setURL() method on H2's JdbcDataSource class.
you may also list any properties here that have a corresponding setXXX method on H2's JdbcDataSource class -->
<properties URL="jdbc:h2:mem:testdb"/>
</dataSource>
</server>
`
当我启动我的应用程序时:
java -jar target/simple-microservice-1.0-SNAPSHOT.jar
我得到一个 ClassNotFoundException:
[baptiste@DESKTOP-FUI7H3K simple-microservice]$ java -jar target/simple-microservice-1.0-SNAPSHOT.jar <br/>
Extraction des fichiers dans /home/baptiste/wlpExtract/simple-microservice-1.0-SNAPSHOT_8298781231136/wlp<br/>
Tous les fichiers du produit ont été extraits.<br/>
Lancement de GettingStartedServer (Open Liberty 19.0.0.9/wlp-1.0.32.cl190920190905-0148) sur OpenJDK 64-Bit Server VM, version 1.8.0_222-b10 (fr_FR)<br/>
[AUDIT ] CWWKE0001I: Le serveur GettingStartedServer a été lancé.<br/>
[AUDIT ] CWWKZ0058I: Recherche d'applications dans dropins.<br/>
[ERROR ] CWWKZ0005E: Le serveur n'est pas configuré pour traiter la ressource à l'emplacement /home/baptiste/wlpExtract/simple-microservice-1.0-SNAPSHOT_8298781231136/wlp/usr/servers/GettingStartedServer/dropins/h2-1.4.199.jar.<br/>
[ERROR ] CWWKE0701E: FrameworkEvent ERROR org.osgi.framework.ServiceException: Exception in com.ibm.ws.resource.internal.ResourceFactoryTrackerData.getService()<br/>
at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:226)<br/>
at [internal classes]<br/>
Caused by: java.lang.RuntimeException: java.sql.SQLNonTransientException: DSRA4000E: Aucune implémentation de org.h2.jdbcx.JdbcDataSource n'a été trouvée pour dataSource[h2test] avec la bibliothèque H2JDBCLib. Il se peut que le nom ou l'emplacement des fichiers JAR du pilote JDBC soit incorrect ou inaccessible. Recherche dans : []. Recherche sous les packages : [org.h2.jdbcx].<br/>
at com.ibm.ws.resource.internal.ResourceFactoryTrackerData.getService(ResourceFactoryTrackerData.java:122)<br/>
... 1 more<br/>
Caused by: java.sql.SQLNonTransientException: DSRA4000E: Aucune implémentation de org.h2.jdbcx.JdbcDataSource n'a été trouvée pour dataSource[h2test] avec la bibliothèque H2JDBCLib. Il se peut que le nom ou l'emplacement des fichiers JAR du pilote JDBC soit incorrect ou inaccessible. Recherche dans : []. Recherche sous les packages : [org.h2.jdbcx].<br/>
at com.ibm.ws.jdbc.internal.JDBCDriverService.classNotFound(JDBCDriverService.java:223)<br/>
... 1 more<br/>
<b>Caused by: java.lang.ClassNotFoundException: org.h2.jdbcx.JdbcDataSource</b><br/>
at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:546)<br/>
... 1 more<br/>
我想我的错误来自我的 server.xml
在这一行:
<fileset dir="${server.config.dir}/lib" includes="h2-1.4.199.jar"/>
或者在 OpenLiberty 插件配置中
你对我纠正这个问题有什么建议? 谢谢
server.config.dir
环境变量指向
/wlp/usr/servers/GettingStartedServer/
如果您将 H2 jar 移动到以下位置以匹配配置,那么它应该可以工作:
/wlp/usr/servers/GettingStartedServer/lib/h2-1.4.199.jar