アプリのconfフォルダーにpersistence.xmlを入れたいです。そこから読み取る必要があることを Persistence.createEntityManagerFactory に伝えるにはどうすればよいですか?
7 に答える
EclipseLink を使用している場合は、persistence.xml の場所を持続性ユニットのプロパティー「eclipselink.persistencexml」で設定できます。
properties.put("eclipselink.persistencexml", "/org/acme/acme-persistence.xml");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("acme", properties);
この解決策は私のために働いた
Thread.currentThread().setContextClassLoader(new ClassLoader() {
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if (name.equals("META-INF/persistence.xml")) {
return Collections.enumeration(Arrays.asList(new File("conf/persistence.xml")
.toURI().toURL()));
}
return super.getResources(name);
}
});
Persistence.createEntityManagerFactory("test");
createEntityManagerFactory メソッドは、CLASSPATH 要素の META-INF ディレクトリ内で persistence.xml ファイルを検索します。CLASSPATH に conf ディレクトリが含まれている場合、EntityManagerFactory 定義を conf/META-INF/persistence.xml に配置できます。
ClassLoader は URLClassLoader である可能性があるため、次の方法で試してください。
final URL alternativePersistenceXmlUrl = new File("conf/persistence.xml").toURI().toURL();
ClassLoader output;
ClassLoader current = Thread.currentThread().getContextClassLoader();
try{
URLClassLoader parent = (URLClassLoader)current;
output = new URLClassLoader(parent.getURLs(), parent){
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if (name.equals("META-INF/persistence.xml")) {
return Collections.enumeration(Arrays.asList(alternativePersistenceXmlUrl));
}
return super.getResources(name);
}
};
}catch(ClassCastException ignored) {
output = new ClassLoader() {
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if (name.equals("META-INF/persistence.xml")) {
return Collections.enumeration(Arrays.asList(alternativePersistenceXmlUrl));
}
return super.getResources(name);
}
};
}
それはうまくいくはずです。特定のテストなどの条件下で機能します。これはハックであり、本番環境では使用しないでください。
プログラムの起動時に(メイン関数の最初の行で)これらの方法を試しました:
jar の resources/META-INF/persistence.xml に persistence.xml を書き込みます。
私はこの方法で問題を抱えていました: Javaはリソースフォルダーに.txtファイルを書き込みます
jar ディレクトリに META-INF フォルダーを作成し、persistence.xml をそこに配置してから、次のコマンドを実行します。
jar uf $jarName META-INF/persistence.xml
このコマンドは、jar 内の META-INF/persistence.xml (ファイル) を置き換えます。
private fun persistence() {
val fileName = "META-INF/persistence.xml"
val jarName: String?
val done = try {
jarName = javaClass.protectionDomain.codeSource.location.path
if (File(fileName).exists() && !jarName.isNullOrBlank()
&& jarName.endsWith(".jar") && File(jarName).exists()) {
Command().exec("jar uf $jarName META-INF/persistence.xml", timeoutSec = 30)
true
} else false
} catch (e: Exception) {
false
}
if (done) {
logger.info { "$fileName exist and will be loaded :)" }
} else {
logger.info {
"$fileName not exist in current folder so it will be read from .jar :(" +
" you can run: jar uf jarName.jar META-INF/persistence.xml"
}
}
}