我在Eclipse中使用Maven时遇到了一个奇怪的配置问题.虽然我可以构建项目并将其部署到tomcat而没有任何错误,但Marker选项卡仍然显示以下消息:
[-] Maven Java EE Configuration Problem
(x) JavaServer Faces 1.2 can not be installed : One or more constraints have not been satisfied.
(x) JavaServer Faces 1.2 requires Dynamic Web Module 2.5 or newer.
Run Code Online (Sandbox Code Playgroud)
我实际上使用的是动态Web模块2.4,它将成为消息的来源.我需要将其更改为至少2.5才能使用JSF.问题是,我甚至没有使用JSF.
因此,项目的一个依赖项可能需要它.我运行以下命令来查找项目的依赖关系树:
mvn dependency:tree -DoutputFile=<i>/path/to/outputFile/dependencies.txt</i>
Run Code Online (Sandbox Code Playgroud)
而且惊喜!没有提到JSF 1.2.
编辑忘记添加我的电脑设置:
操作系统:Ubuntu 12.10
Eclipse:4.2 SR1
Java:jdk1.5.0_22和jdk1.7
Apache Maven:3.0.4
Maven主页:/ usr/share/maven
m2e:1.3.1.20130219-1424
m2e-wtp:0.17.0.20130212-1821
我的同事都没有遇到这个问题.其中两个使用Windows,两个使用Ubuntu 12.10.其中一个使用Eclipse 4.2,其他使用Eclipse 3.7.显然,这要么与4.2SR1有关,要么与我的项目设置有关.但我无法找到问题所在.
这是我的pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>edited</groupId>
<artifactId>edited</artifactId>
<packaging>war</packaging>
<version>edited</version>
<name>edited</name>
<distributionManagement>
<repository>
<id>deployment</id>
<name>Internal Releases</name>
<url>http://edited/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>deployment</id> …Run Code Online (Sandbox Code Playgroud) 解释这有点棘手.我有一个A类:
public class A {
private Integer a1;
private Integer a2;
// getters and setters.
}
Run Code Online (Sandbox Code Playgroud)
有一个静态类B返回我的类A:
public static class B {
public static A getCurrentA() {
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要找到B返回的所有A类用法.所以让我们说C级呼叫c.setA(B.getCurrentA()),然后再进一步调用c.getA().getA2();,我想找到所有这些.
在真实场景中,我有217个不同的类调用B.getCurrentA().我不能手动跟踪Eclipse中的所有调用,并找出调用哪些方法.
Eclipse调用层次结构视图仅向我显示所有调用B.getCurrentA().
我怎样才能做到这一点?
编辑
克里斯海耶斯明白我想做什么.为了在不破坏整个系统的情况下重构一些非常糟糕的遗留代码,我需要首先使用Hibernate的投影微调一些查询(系统中的每个映射实体都被急切加载,并且许多实体是相关的,因此一些查询需要很长时间时间取出一切).但首先我需要找到使用哪些属性,以便我不会在某处获得NullPointerException ...
这是我手动做的一个例子:
打开找到的第一个方法,让我们说它是下面的方法:
public class CController {
C c = new C();
CFacade facade = new CFacade();
List<C> Cs = new ArrayList<C>();
public void getAllCs() {
c.setA(B.getCurrentA()); // found it!
facade.search(c);
} …Run Code Online (Sandbox Code Playgroud)作为Weblogic的新手,我通过将war文件复制到autodeploy文件夹,按照一些自述文件将应用程序部署到Weblogic.他们自动在Weblogic控制台中显示,到目前为止一切顺利.
后来,我从autodeploy文件夹中删除了一些这些应用程序,期望它们也从"部署"页面中消失.令我惊讶的是,一旦我启动服务器,他们仍然在那里,我也无法删除它们:Weblogic说我需要从autodeploy文件夹中删除战争(!).
当然,我应该先阅读文档,其中说明如下:
自动部署,重新部署和取消部署存档的应用程序
要自动部署已归档的应用程序,请将其归档文件复制到/ autodeploy目录.WebLogic Server自动将应用程序的部署模式设置为阶段模式.
可以在服务器运行时动态重新部署自动部署的部署单元.要动态重新部署,请将新版本的存档文件复制到/ autodeploy目录中的现有文件中.
要取消部署已自动部署的已归档部署单元,请从/ autodeploy目录中删除该应用程序.WebLogic Server会停止应用程序并将其从配置中删除. 注意: 如果在服务器未处于活动状态时从/ autodeploy目录中删除应用程序,则即使服务器再次处于活动状态,WebLogic Server也不会检测到应用程序已被删除.为了防止不同步的域树,BEA建议您仅在服务器处于活动状态时从/ autodeploy目录中删除应用程序.
由于我在服务器关闭时删除了文件,因此它们仍会显示在那里.在这个特定的文档中没有的是如何在它不同步时修复它.
我想在我的脚本中编写一个进度指示器函数,它循环"请等待"消息,直到完成调用它的任务.
我希望它是一个函数,以便我可以在其他脚本中重用它.
为了实现这一点,函数需要与其他函数松散耦合,即调用它的函数不必知道其内部代码.
这是我到目前为止所拥有的.此函数接收调用者的pid并循环,直到任务完成.
function progress() {
pid="$1"
kill -n 0 "${pid}" &> /dev/null && echo -ne "please wait"
while kill -n 0 "${pid}" &> /dev/null ; do
echo -n "."
sleep 1
done
}
Run Code Online (Sandbox Code Playgroud)
在脚本中使用它时,它可以正常工作,例如:
#imports the shell script with the progress() function
. /path/to/progress.sh
echo "testing"
# $$ returns the pid of the script.
progress $$ &
sleep 5
echo "done"
Run Code Online (Sandbox Code Playgroud)
输出:
$ testing
$ please wait.....
$ done
Run Code Online (Sandbox Code Playgroud)
问题是当我从另一个函数调用它时,因为函数没有pids:
function my_func() {
progress $$ &
echo "my …Run Code Online (Sandbox Code Playgroud) 我有一个具有 4 个非常相似方法的控制器,在远程服务器上调用 API 以对不同类型的用户执行不同的操作。这些 API 调用之间发生的变化只是端点和一些参数。
因此,这 4 个方法都使用非常相似的代码调用服务:它们从服务器获取令牌、设置参数、返回 API 的响应。由于稍后将添加更多操作,我决定使用工厂方法模式创建一个 ServiceFactory 并在服务上使用模板模式以避免代码重复。
我的问题是,为了让工厂自动装配服务,它需要与它们耦合,我必须对@Autowire每个实现进行耦合。有更好的解决方案吗?
这是我到目前为止的代码:
@RestController
public class ActionController {
@Autowired
private SsoService ssoService;
// this is the factory
@Autowired
private ServiceFactory factory;
@PostMapping("/action")
public MyResponse performAction(@RequestBody MyRequest request, HttpServletRequest req) {
// template code (error treatment not included)
request.setOperator(ssoService.getOperator(req));
request.setDate(LocalDateTime.now());
return serviceFactory.getService(request).do();
}
}
Run Code Online (Sandbox Code Playgroud)
@Component
public class ServiceFactory {
@Autowired private ActivateUserService activateUserService;
@Autowired private Action2UserType2Service anotherService;
//etc
public MyService getService(request) { …Run Code Online (Sandbox Code Playgroud) 我有一个类FileGenerator,我正在为generateFile()应该执行以下操作的方法编写测试:
1)它应该调用静态方法getBlockImpl(FileTypeEnum)上BlockAbstractFactory
2)它应该blockList从子类方法填充变量getBlocks()
3)它应该createFile从FileHelper传递String参数的最终辅助类调用静态方法
4)它应该调用BlockControllerblockList 中每个的run方法
到目前为止,我有这个空方法:
public class FileGenerator {
// private fields with Getters and Setters
public void generateBlocks() {
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用JUnit,Mockito来模拟对象,我尝试使用PowerMockito来模拟静态和最终类(Mockito没有这样做).
我的问题是:我的第一个测试(调用方法getBlockList()从BlockAbstractFactory)在流逝,即使是在没有实现generateBlocks().我已经实现了静态方法BlockAbstractFactory(返回null,到目前为止),以避免Eclipse语法错误.
如何测试是否在其中调用静态方法fileGerator.generateBlocks()?
到目前为止,这是我的测试类:
@RunWith(PowerMockRunner.class)
public class testFileGenerator {
FileGenerator fileGenerator = new FileGenerator();
@Test
public void shouldCallGetBlockList() {
fileGenerator.setFileType(FileTypeEnum.SPED_FISCAL);
fileGenerator.generateBlocks();
PowerMockito.mockStatic(BlockAbstractFactory.class);
PowerMockito.verifyStatic();
BlockAbstractFactory.getBlockImpl(fileGenerator.getFileType());
}
}
Run Code Online (Sandbox Code Playgroud) 我在Linux(arch)上,尝试使用ssh密钥在本教程之后使用私有bitbucket git存储库配置Spring Cloud Config ,但我不断收到错误:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed; nested exception is java.lang.IllegalStateException: Cannot
clone or checkout repository] with root cause com.jcraft.jsch.JSchException: Auth fail
Run Code Online (Sandbox Code Playgroud)
现在,根据教程,它应该工作:
如果您不使用HTTPS和用户凭据,当您将密钥存储在默认目录(〜/ .ssh)中并且uri指向SSH位置时,SSH也应该开箱即用,例如"git@github.com:配置/云配置".重要的是〜/ .ssh/known_hosts中的所有键都是"ssh-rsa"格式.不支持新的"ecdsa-sha2-nistp256"格式.使用JGit访问存储库,因此您在其上找到的任何文档都应该适用.HTTPS代理设置可以在〜/ .git/config中设置,也可以通过系统属性(-Dhttps.proxyHost和-Dhttps.proxyPort)以与任何其他JVM进程相同的方式设置.
我在〜/ .ssh文件夹中有一个名为bitbucket-rsa的私有ssh密钥,使用该命令创建ssh-keygen -t rsa -b 4096 -C "my-email@provider.com".公钥正确添加到Bitbucket,因为我能够从命令行克隆,拉出和推送存储库.私钥已添加到ssh-agent中,bitbucket.org存在于known_hosts文件中.
这是config-service项目中的bootstrap.yml:
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: "git@bitbucket.org:TarekSaid/my-private-repo.git"
server:
port: 8888
Run Code Online (Sandbox Code Playgroud)
使用带有用户名和密码的https有效,但我仍然更喜欢使用ssh密钥,我该如何使其工作?
我对业务逻辑验证有一系列要求:
所以我想到实现一个动态的责任链,它从表中加载步骤顺序和类名,用它们实例化它们Class.forName().但是我不太喜欢将className存储在表中,因为这可能会导致潜在的问题(例如,重构验证器的名称只会破坏代码).这就是我做的:

当然,解决方案必须越灵活,它就越复杂.不过,我想知道是否有办法保证上述要求而不将类名存储在表中?