使用外部属性文件执行jar

时间:2012-04-12 16:49:36

标签: java properties jar

我有一个带有main类的jar,可以执行如下:java -jar test.jar

在罐子里面我有类似

的东西
public static void main(String[] args) throws IOException {
    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("config.properties");
    Properties prop = new Properties();
    prop.load(is);
    //then I wanna fetch all the properties in the config.properties file
}

我同时运行:

  1. java -jar test.jar

  2. java -jar test.jar -cp / tmp(其中config.properties所在的位置)

  3. java -jar test.jar -cp /tmp/config.properties(显然它不起作用,但是让我知道我想在这里实现的目标)

  4. 代码不起作用,虽然我将config.properties文件的路径放在$ PATH和$ CLASSPATH下,但三者都抛出了NPE。

    关键是,从长远来看,我会将配置文件放在$ {my-config-path}中,并正确读取/处理它。但暂时我只想要快速而肮脏的东西。

    1. 我不想在我的jar中包含属性文件。
    2. 我希望将它保存在类路径或路径中,当我执行jar时,它会毫无问题地找到它。

2 个答案:

答案 0 :(得分:5)

指定-jar后,将忽略所有类路径选项。

相反,请指定默认配置位置(如在用户的主目录中)并允许在命令行上覆盖。

有各种命令行解析选项,最简单的带有选项信息的annotate类属性,例如,长和短选项名称,用法等。

或使用-D选项并检索相应的系统属性。

另一个选项是Preferences API。

答案 1 :(得分:0)

一个示例示例

// Render Loop.
while( !glfwWindowShouldClose( window ) )
{

    // Input.
    processInput( window );

    // Render.

    // Bind to frameBuffer and draw scene as normally would to colour texture.
    glBindFramebuffer( GL_FRAMEBUFFER, frameBufferOne );

    glClearColor( 0.2f, 0.3f, 0.1f, 1.0f );
    glClear( GL_COLOR_BUFFER_BIT );

    bufferShader.use();
    float currentFrame = glfwGetTime();
    //Set the iTimeDelta uniform.
    float deltaTime = currentFrame - lastFrame;
    lastFrame = currentFrame;
    bufferShader.setFloat( "iTimeDelta", deltaTime );
    // Set the iTime uniform.
    float timeValue = currentFrame;
    bufferShader.setFloat( "iTime", timeValue );
    // Set the iResolution uniform.
    bufferShader.setVec2( "iResolution", WIDTH, HEIGHT );
    // Input iMouse.
    double xPos, yPos;
    glfwGetCursorPos( window, &xPos, &yPos );
    yPos = HEIGHT - yPos;
    bufferShader.setVec2( "iMouse", xPos, yPos );

    glBindVertexArray( VAO );
    glBindTexture( GL_TEXTURE_2D, textureColourBufferOne );
    glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0 );
    glBindVertexArray( 0 );

    glBindFramebuffer( GL_FRAMEBUFFER, 0 );
    glDisable( GL_DEPTH_TEST );

    glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
    glClear( GL_COLOR_BUFFER_BIT );

    ourShader.use();
    ourShader.setVec2( "iResolution", WIDTH, HEIGHT );
    // Set the iTime uniform.
    ourShader.setFloat( "iTime", timeValue );
    glBindVertexArray(VAO);
    glBindTexture( GL_TEXTURE_2D, textureColourBufferOne );
    glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0 );

    glfwSwapBuffers( window );
    glfwPollEvents();

    frameCount++;
    finalTime = time( NULL );
    if( finalTime - initialTime > 0 )
    {

        std::cout << "FPS : " << frameCount / (finalTime - initialTime) << std::endl;
        frameCount = 0;
        initialTime = finalTime;

    }