5

我有一个使用 .properties 文件进行配置的 java 项目。在服务器上,启动时,我将类路径设置为包含一个包含所有属性文件的文件夹。在我的本地机器上,我想指向一个不同的文件夹。

我希望添加到类路径中,理想情况下适用于所有项目,但将其添加到每个项目中也可以。我尝试将 更改Run > VM Options为包含类路径,但是通过该更改它找不到主类,我得到java.lang.NoClassDefFoundError. 我也尝试过直接更改 nbactions.xml 以将类路径设置为-classpath ~\MyFolder\;%classpath,但这也有同样的问题。

更困难的是,服务器运行的是 linux,而我的本地机器运行的是 Windows。

4

5 回答 5

11

我也坚持了很长时间的主题启动问题。我的目标 - 将用于调试目的的配置文件放在项目根目录中并将类路径扩展为${basedir},所以这段代码:

String appConfigLocation = System.getProperty("config.location");
if (appConfigLocation == null) {
    logger.error("System property 'config.location' is not set...");
    System.exit(1);
}
InputStream appConfigStream = Main.class.getClassLoader().getResourceAsStream(appConfigLocation);
if (appConfigStream == null) {
    logger.error("Can't find resource {} in classpath, fix 'config.location'...", appConfigLocation);
    System.exit(1);
}
Properties appProps = new Properties();
try {
    appProps.load(appConfigStream);
} catch (IOException ex) {
    System.out.println("IO error during loading of {}...", appConfigLocation);
    System.exit(1);
}

从中读取配置${basedir}。我喜欢这样,而不是把它们放到src/main/resources.

检查ExecMojo.javav1.2.1的来源http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.mojo/exec-maven-plugin/1.2.1/org/codehaus/mojo/exec/ExecMojo .java?av=f

if ( CLASSPATH_TOKEN.equals( args[i] ) ) {
    commandArguments.add( computeClasspathString( null ) );
}

和 v1.3.2 http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.mojo/exec-maven-plugin/1.3.2/org/codehaus/mojo/exec/ExecMojo.java ?av=f :

if ( args[i].contains( CLASSPATH_TOKEN ) ) {
     commandArguments.add( args[i].replace( CLASSPATH_TOKEN, 
                           computeClasspathString( null ) ) );
}

所以更新 NB config Execute 目标到新版本:

process-classes org.codehaus.mojo:exec-maven-plugin:1.3.2:exec

-classpath并在参数中使用复杂的exec.args参数:

exec.args=-classpath %classpath:.:"${basedir}" \
    -Dconfig.location=app.properties \
    -Dlogback.configurationFile=logback.xml \
    ${packageClassName}

修复您需要具有此类行为的任何操作:

在此处输入图像描述

也可以看看:

于 2015-03-11T16:23:19.783 回答
5

嗨,我有类似的需要给 NetBeans7.4 一个 jar 的类路径,该 jar 带有一个带有 Maven 依赖项的驱动程序,例如c:\Program Files\Java\jdk1.7.0_25\db\lib\derby.jar在一个名为 MyProject 的 Java Maven 项目中。
正如您对 . Run > VM Options_ ' 并选择它 4) 在 'Set Properties' 文本框中编辑输入 或者类似地编辑 nbactions.xml。完成此操作后,我只需按绿色箭头即可在 NetBeans 中运行该项目。




exec.args=-cp %classpath;.;"c:\Program Files\Java\jdk1.7.0_25\db\lib\derby.jar" biz.letsweb.derbyconnect.App exec.executable=java exec.workingdir=c:\Users\Tomasz\Documents\NetBeansProjects\DerbyConnect\target\classes

于 2014-08-20T21:30:13.550 回答
0

这就是我为我的许多项目添加类路径的方式

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.nitinsurana.policereports.GUI</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
于 2013-11-14T05:42:49.653 回答
0

将属性包含为怎么样?并且您在本地使用的那些仅在 a 中并在本地计算机上激活该配置文件?

于 2013-11-13T13:35:37.990 回答
0

我最终在 NetBeans 7.3.1 中为我的类似案例使用了一个开箱即用的解决方案:

在运行时将文件添加到 java 类路径

private static void addSoftwareLibrary(File file) throws Exception {
  Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
  method.setAccessible(true);
  method.invoke(ClassLoader.getSystemClassLoader(), new Object[]{file.toURI().toURL()});
}

这给了我一种在运行时通过程序参数将文件添加到我的类路径的方法。我在研究时编译的相关笔记:


要包含仅用于编译而不是运行时集的依赖项: Dependency Scope

<dependency><scope>provided</scope>...</dependency>

要从阴影 jar 中排除依赖项,请设置:排除

<exclude>groupId:artifactId[[:type]:classifier]</exclude>

要将资源从典型源目录之外复制到目标目录:复制资源

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>target/extra-resources</outputDirectory>
              <resources>          
                <resource>
                  <directory>extra-resources</directory>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

请注意,目录的基本路径是项目主目录。链接的帖子<filtering>true</filtering>可能会导致 Netbeans 7.3.1 中出现“无效标记”。

于 2015-03-01T00:30:00.410 回答