我有一个java项目,它使用.properties文件进行配置。在服务器上,启动时,我将类路径设置为包含一个包含所有属性文件的文件夹。在我的本地机器上,我想指向另一个文件夹。
我希望添加到类路径,理想情况下是所有项目,但是将它添加到每个项目也很好。我已经尝试将Run > VM Options
更改为包含类路径,但是在更改后它无法找到主类,我得到java.lang.NoClassDefFoundError
。我也尝试直接更改nbactions.xml以将类路径设置为-classpath ~\MyFolder\;%classpath
,但这也存在同样的问题。
为了增加难度,服务器在我的本地计算机运行Windows时运行linux。
答案 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 ) );
}
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}
修复执行此类行为所需的任何操作:
另见:
答案 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中的“无效标记”。