我在Netbeans 15中遇到了这个问题。我正在使用OpenJDK的JDK 17。我用 Source Packages 和 Test Packages 配置了一个Web项目。与Tomcat 9一起运行。对我来说,通常的事情是改变源代码,并在Tomcat服务器中热重新加载,它工作得很好。到这里都没问题。
最近,我尝试更改一个类构造函数,它编译得很好。这里有一个类似的上下文类示例。
package com;
import javax.servlet.http.*;
import java.sql.Connection;
import java.sql.SQLException;
public class ClassA extends ClassAAbstract{
/**
* Creates a new instance of ClassA
*/
public ClassA(HttpServletRequest request) throws SQLException {
super(request);
}
public ClassA(HttpServletRequest request, String id) throws SQLException {
super(request, id);
}
public ClassA(String str1, String str2, Connection conn) throws SQLException {
super(str1, str2, conn);
}
}
但是...当我想创建类测试时,我遇到了这个问题。上下文类似的测试类:
package com;
import Types.DatabaseDependableTest;
import com.ClassA;
import java.sql.SQLException;
import org.junit.Test;
public class ClassATest extends DatabaseDependableTest {
public ClassATest () {
super();
}
@Test
public void test() throws SQLException {
new ClassA("", "", this.conn); -> error
}
}
显示的错误显示以下内容:
- 找不到适合ClassA(String,String,Connection)构造函数com的构造函数。ClassA(HttpServletRequest)不适用 *
它建议使用另外两个构造函数。有没有人能猜到会发生什么?
我试过了
1.关闭并重新打开项目。
1.删除NetBeans项目文件夹并再次打开它
1.已删除缓存并再次尝试这两个选项。
值得一提的是,我有一个这个环境的副本(以前的版本。相同的组件,JDK 17,Tomcat 9...),当我更新源代码中的类方法时,那里的测试工作得非常好。
编辑1
我取得了进展,并发现了以下情况。
如果我有一个包A和它里面的类A1、A2、A3,那么测试包中的测试将不会识别这些类的任何进一步更新,因为它的初始配置。
示例:
package A;
class A {
public A(String str){
}
}
下面的测试将有效:
package Test;
class ATest {
public ATest (){
}
@Test
public void test(){
new A("STRING");
}
}
如果我给类A添加一个新的构造函数,那么我就不能在测试中使用。
package A;
class A {
public A(String str){
}
public A(String str,String str2){ -> New constructor
}
}
类似以下的测试将不起作用:
package Test;
class ATest {
public ATest (){
}
@Test
public void test(){
new A("STRING","STRING"); -> error ( constructor A in...)
}
}
然而,如果我在包A中创建一个新的类,比如说ANewClass,那么我可以创建一个可编译的测试,并更改其代码,因为它将在测试中考虑。
package A;
class ANewClass {
public ANewClass (String str){
}
public ANewClass (String str,String str2){
}
}
下面的测试将有效:
package Test;
class ATest {
public ATest (){
}
@Test
public void test(){
new ANewClass("STRING");
new ANewClass("STRING","STRING");
// Both OK!
}
}
我猜可能是类路径或某个缓存构建的问题。
编辑2
由于我还使用Netbeans集成将此代码部署到Tomcat,因此我检查了代码,并且代码在部署时有效地工作。问题具体存在于测试包中或与之相关。
解决方案
我有一个库/jar,它有相同的类,所以我猜它一定是覆盖了源代码实现,我认为这是错误的,因为 .class 文件应该优先于库。无论如何,由于代码和jar是一样的,我删除了它,工作得很好。
1条答案
按热度按时间f8rj6qna1#
有一个重复的资源正在覆盖正在更新的资源。特别是一个包含源代码的jar,这些源代码也存在于源代码包中,并且首先被加载,而不考虑最后一个。删除JAR文件解决了问题。