将类路径添加到netbeans maven项目

时间:2013-11-13 11:08:58

标签: java maven netbeans

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

我希望添加到类路径,理想情况下是所有项目,但是将它添加到每个项目也很好。我已经尝试将Run > VM Options更改为包含类路径,但是在更改后它无法找到主类,我得到java.lang.NoClassDefFoundError。我也尝试直接更改nbactions.xml以将类路径设置为-classpath ~\MyFolder\;%classpath,但这也存在同样的问题。

为了增加难度,服务器在我的本地计算机运行Windows时运行linux。

5 个答案:

答案 0 :(得分:9)

我长期坚持主题启动问题。我的目标 - 在项目根目录中将配置文件用于调试目的,并将类路径扩展到${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.java的来源v1.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配置执行目标到新版本:

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

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

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

修复执行此类行为所需的任何操作:

enter image description here

另见:

答案 1 :(得分:4)

您好我有类似的需要给NetBeans7.4一个类路径到一个jar,其驱动程序与Maven依赖关系,例如:名为MyProject的Java Maven项目中的c:\Program Files\Java\jdk1.7.0_25\db\lib\derby.jar
正如您在考虑使用Run > VM Options时,我建议如下:
1)右键单击MyProject打开项目属性
2)在“项目属性”弹出窗口中,选择“操作”
3)在'Actions'中找到'Run pproject'并选择它
4)在“设置属性”文本框中输入编辑
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
或者以类似方式编辑nbactions.xml。一旦我这样做,我就可以通过按绿色箭头在NetBeans中运行项目。

答案 2 :(得分:0)

如何将属性包括在内?那些你在本地使用的只有一个并在本地机器上激活该配置文件?

答案 3 :(得分:0)

这就是我为许多项目添加classpath的方法

<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>

答案 4 :(得分:0)

我最终在NetBeans 7.3.1中使用了类似的解决方案:

Adding files to java classpath at runtime

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()});
}

这给了我一种hacky方法,可以在运行时通过程序参数将文件添加到我的类路径中。我在研究时编写的相关注释:


要仅包含编译依赖项, not runtime 设置: Dependency Scope

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

要从着色jar中排除依赖项,请设置:Exclude

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

要从典型源目录外部将资源复制到目标目录:Copy Resources

<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中的“无效标记”。