【问题标题】:Add classpath to netbeans maven project将类路径添加到 netbeans maven 项目
【发布时间】:2013-11-25 22:57:46
【问题描述】:

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

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

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

【问题讨论】:

  • 看我的回答。它以仅修改 NB 配置的方式解决了您的问题。我和你有同样的要求,花了 2 个小时才得到有效的解决方案。好问题 +1

标签: java maven netbeans


【解决方案1】:

我也长期关注主题启动问题。我的目标 - 将用于调试目的的配置文件放在项目根目录中并将类路径扩展到${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

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

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

修正任何你需要有这样的行为的动作:

另见:

【讨论】:

  • Jeyendran 对此发表了评论作为答案(可能是由于代表不足,无法添加 cmets),我将在此处复制,以防对未来的访问者有用:我必须做的唯一更改是将类路径分隔符“:”替换为“;”在“-classpath”参数中,因为我在 Windows 上运行。对于 Unix/Linux/Mac,@gavenkoa 描述的“:”可以完美运行。
【解决方案2】:

您好,我也有类似的需要,为 NetBeans7.4 提供一个带有驱动程序的 jar 的类路径,而不是 Maven 依赖项,例如c:\Program Files\Java\jdk1.7.0_25\db\lib\derby.jar 在名为 MyProject 的 Java Maven 项目中。
正如您对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 中运行项目。

【讨论】:

  • ExecMojo.javaif ( CLASSPATH_TOKEN.equals( args[i] ) ) { commandArguments.add( computeClasspath( null ) ); } 所以你的-cp %classpath;.;/path/to 不适用于1.2.1 - NetBeans 8.1 附带,但已经在 1.3.2 中修复......所以你需要更新 NB 执行目标 值。看我的回答。
  • 是的!这几天一直在找这个。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 是否可以只为本地机器设置这个?我想要一个用于服务器的类路径和另一个用于本地测试的类路径(正如我所说,一个运行 linux,另一个运行 Windows,所以它们翻译得不是很好)
    • 您必须为每个文件创建单独的配置文件。 This 可以是一个好的开始。
    【解决方案5】:

    我最终在 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()});
    }
    

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


    要包含仅用于编译的依赖项,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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多