JAR 파일 외부에서 속성 파일을 읽습니다.
실행할 수 있도록 모든 코드가 보관되어 있는 JAR 파일이 있습니다.각 실행 전에 변경/편집해야 하는 속성 파일에 액세스해야 합니다.속성 파일을 JAR 파일이 있는 디렉토리와 동일한 디렉토리에 보관하고 싶다.자바에게 그 디렉토리에서 속성 파일을 가져오라고 할 수 있는 방법이 있습니까?
주의: 속성 파일을 홈 디렉토리에 보관하거나 명령줄 인수로 속성 파일의 경로를 전달하지 않습니다.
그래서, 당신은 당신의 치료와.properties
파일을 주/실행 가능 자리의 리소스가 아닌 파일로 주/실행 가능 자리와 동일한 폴더에 저장합니다.이 경우 저만의 해결책은 다음과 같습니다.
우선: 프로그램 파일 아키텍처는 다음과 같습니다(메인 프로그램이 main.jar이고 메인 속성 파일이 main.properties인 경우).
./ - the root of your program
|__ main.jar
|__ main.properties
이 아키텍처에서는 main.jar 실행 전 또는 실행 중에 임의의 텍스트에디터를 사용하여 main.properties 파일의 속성을 변경할 수 있습니다(프로그램의 현재 상태에 따라 다름).예를 들어, main.properties 파일에는 다음이 포함됩니다.
app.version=1.0.0.0
app.name=Hello
따라서 루트/베이스 폴더에서 메인 프로그램을 실행하면 보통 다음과 같이 실행됩니다.
java -jar ./main.jar
또는 바로:
java -jar main.jar
main.jar에서 main.properties 파일에 있는 모든 속성에 대해 몇 가지 유틸리티 메서드를 작성해야 합니다.예를 들어,app.version
소유지는 가질 것이다.getAppVersion()
방법은 다음과 같습니다.
/**
* Gets the app.version property value from
* the ./main.properties file of the base folder
*
* @return app.version string
* @throws IOException
*/
import java.util.Properties;
public static String getAppVersion() throws IOException{
String versionString = null;
//to load application's properties, we use this class
Properties mainProperties = new Properties();
FileInputStream file;
//the base folder is ./, the root of the main.properties file
String path = "./main.properties";
//load the file handle for main.properties
file = new FileInputStream(path);
//load all the properties from this file
mainProperties.load(file);
//we have loaded the properties, so close the file handle
file.close();
//retrieve the property we are intrested, the app.version
versionString = mainProperties.getProperty("app.version");
return versionString;
}
메인 프로그램의 어느 부분에서든app.version
이 메서드를 다음과 같이 부릅니다.
String version = null;
try{
version = getAppVersion();
}
catch (IOException ioe){
ioe.printStackTrace();
}
나는 다른 방법으로 그것을 했다.
Properties prop = new Properties();
try {
File jarPath=new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
String propertiesPath=jarPath.getParentFile().getAbsolutePath();
System.out.println(" propertiesPath-"+propertiesPath);
prop.load(new FileInputStream(propertiesPath+"/importer.properties"));
} catch (IOException e1) {
e1.printStackTrace();
}
- Jar 파일 경로를 가져옵니다.
- 해당 파일의 상위 폴더를 가져옵니다.
- 속성 파일 이름과 함께 InputStreamPath에서 이 경로를 사용합니다.
jar 파일에서 파일 디렉토리에 있는 파일에 액세스하는 데 항상 문제가 있습니다.jar 파일에서 클래스 경로를 제공하는 것은 매우 제한적입니다.대신 bat 파일이나 sh 파일을 사용하여 프로그램을 시작하세요.이렇게 하면 시스템상의 임의의 폴더를 참조하여 클래스 경로를 원하는 대로 지정할 수 있습니다.
이 질문에 대한 답변도 확인해 주십시오.
sqlite를 포함하는 Java 프로젝트의 .exe 파일 만들기
저도 비슷한 경우가 있습니다: 제 것을 원한다는 것*.jar
하여 다음 수 있습니다.*.jar
파일. 이 답변도 참조하십시오.
파일 구조는 다음과 같습니다.
./ - the root of your program
|__ *.jar
|__ dir-next-to-jar/some.txt
수 를 들어, 파일을 로드할 수 있습니다).some.txt
합니다.*.jar
다음 파일을 첨부합니다.
InputStream stream = null;
try{
stream = ThisClassName.class.getClass().getResourceAsStream("/dir-next-to-jar/some.txt");
}
catch(Exception e) {
System.out.print("error file to stream: ");
System.out.println(e.getMessage());
}
이 '이든'으로 .stream
에서 속성 합니다.current directory
.
주의:방법Properties#load
는 ISO-8859-1 인코딩을 사용합니다.
Properties properties = new Properties();
properties.load(new FileReader(new File(".").getCanonicalPath() + File.separator + "java.properties"));
properties.forEach((k, v) -> {
System.out.println(k + " : " + v);
});
해 주세요.java.properties
에 있다current directory
. 그 디렉토리로 해 주세요.예를 , 기동 스크립트를 수 있습니다
#! /bin/bash
scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $scriptdir
java -jar MyExecutable.jar
cd -
에 신의로 the the, the put the the the the the the 를 넣기만 됩니다.java.properties
IDE에서도 이 코드를 사용할 수 있도록 프로젝트 루트에 파일을 저장합니다.
log4j2.properties를 사용하여 classpath 또는 외부 Configuration을 모두 수행하는 예가 있습니다.
package org.mmartin.app1;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.LogManager;
public class App1 {
private static Logger logger=null;
private static final String LOG_PROPERTIES_FILE = "config/log4j2.properties";
private static final String CONFIG_PROPERTIES_FILE = "config/config.properties";
private Properties properties= new Properties();
public App1() {
System.out.println("--Logger intialized with classpath properties file--");
intializeLogger1();
testLogging();
System.out.println("--Logger intialized with external file--");
intializeLogger2();
testLogging();
}
public void readProperties() {
InputStream input = null;
try {
input = new FileInputStream(CONFIG_PROPERTIES_FILE);
this.properties.load(input);
} catch (IOException e) {
logger.error("Unable to read the config.properties file.",e);
System.exit(1);
}
}
public void printProperties() {
this.properties.list(System.out);
}
public void testLogging() {
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
logger.fatal("This is a fatal message");
logger.info("Logger's name: "+logger.getName());
}
private void intializeLogger1() {
logger = LogManager.getLogger(App1.class);
}
private void intializeLogger2() {
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File(LOG_PROPERTIES_FILE);
// this will force a reconfiguration
context.setConfigLocation(file.toURI());
logger = context.getLogger(App1.class.getName());
}
public static void main(String[] args) {
App1 app1 = new App1();
app1.readProperties();
app1.printProperties();
}
}
--Logger intialized with classpath properties file--
[DEBUG] 2018-08-27 10:35:14.510 [main] App1 - This is a debug message
[INFO ] 2018-08-27 10:35:14.513 [main] App1 - This is an info message
[WARN ] 2018-08-27 10:35:14.513 [main] App1 - This is a warn message
[ERROR] 2018-08-27 10:35:14.513 [main] App1 - This is an error message
[FATAL] 2018-08-27 10:35:14.513 [main] App1 - This is a fatal message
[INFO ] 2018-08-27 10:35:14.514 [main] App1 - Logger's name: org.mmartin.app1.App1
--Logger intialized with external file--
[DEBUG] 2018-08-27 10:35:14.524 [main] App1 - This is a debug message
[INFO ] 2018-08-27 10:35:14.525 [main] App1 - This is an info message
[WARN ] 2018-08-27 10:35:14.525 [main] App1 - This is a warn message
[ERROR] 2018-08-27 10:35:14.525 [main] App1 - This is an error message
[FATAL] 2018-08-27 10:35:14.525 [main] App1 - This is a fatal message
[INFO ] 2018-08-27 10:35:14.525 [main] App1 - Logger's name: org.mmartin.app1.App1
-- listing properties --
dbpassword=password
database=localhost
dbuser=user
에서는 기에 you면면면면면면면면면면면면라고 하면.getPath()
그러면 Jar 경로가 반환되고 Jar와 함께 배치된 다른 모든 구성 파일을 참조하기 위해 Jar의 부모가 필요할 것입니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」메인 클래스 내에 코드를 추가합니다.
File jarDir = new File(MyAppName.class.getProtectionDomain().getCodeSource().getLocation().getPath());
String jarDirpath = jarDir.getParent();
System.out.println(jarDirpath);
File parentFile = new File(".");
String parentPath = file.getCanonicalPath();
File resourceFile = new File(parentPath+File.seperator+"<your config file>");
언급URL : https://stackoverflow.com/questions/8775303/read-properties-file-outside-jar-file
'source' 카테고리의 다른 글
C++의 "-->" 연산자는 무엇입니까? (0) | 2023.02.06 |
---|---|
Microsoft Azure:BLOB 컨테이너에 하위 디렉토리를 만드는 방법 (0) | 2023.02.06 |
PHP는 에 상당합니다.NET/Java의 toString() (0) | 2023.01.29 |
루프 후 문자열 버퍼/빌더 지우기 (0) | 2023.01.29 |
사전 대신 명명된 튜플을 사용해야 하는 시기와 이유는 무엇입니까? (0) | 2023.01.29 |