我试图在我的JSF应用程序中使用Font Awesome图标.我按照入门说明并将以下内容添加到我的视图部分,取得了一些成功<h:head>
:
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css"
rel="stylesheet" />
Run Code Online (Sandbox Code Playgroud)
当我使用这个icon-home
类时,这给了我一个很好的主页图标:
但是,我不想依赖引导服务器来提供Font Awesome资源,所以我试图将这些与我的战争捆绑在一起,并配置我的视图以使用捆绑的资源.
我正在使用webjars项目创建的预制JAR.我的pom具有以下依赖性:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>font-awesome</artifactId>
<version>3.2.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这将JAR放在我的WAR的WEB-INF/lib目录中.JAR结构的相关部分是:
META-INF
- MANIFEST.MF
+ maven
- resources
- webjars
- font-awesome
- 3.2.1
- css
- font-awesome.css
- *other css files*
- font
- *font files*
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法在我的项目中包含图标:
<h:outputStylesheet library="webjars"
name="font-awesome/3.2.1/css/font-awesome.css" />
Run Code Online (Sandbox Code Playgroud)
但是,这会将以前工作的主页图标呈现为:
我的浏览器(Chrome)在控制台中显示以下错误(域/端口/上下文根已更改以保护无辜;):
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.woff?v=3.2.1 404 (Not Found)
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.ttf?v=3.2.1 404 (Not Found)
GET http://DOMAIN:PORT/CONTEXT-ROOT/javax.faces.resource/font-awesome/3.2.1/font/fontawesome-webfont.svg 404 (Not Found)
Run Code Online (Sandbox Code Playgroud)
所以看起来虽然正确解析了css文件,但是找不到包含css文件引用的字体的文件.我已在css文件中检查了这些引用,它们是:
src: url('../font/fontawesome-webfont.eot?v=3.2.1');
src: …
Run Code Online (Sandbox Code Playgroud) 我在使Eclipse符合测试范围的Maven依赖项时遇到了一些问题 - 它出现在构建路径上并且弄乱了eclipse的编译/ javadoc解析.
我一直在使用该javaee-api-6.0
库来编译我的Java EE应用程序.
但是,出于单元测试的目的,我想访问的不仅仅是api - 我需要一个实现.所以我将嵌入式glassfish libs包含在这样的测试范围内:
<repositories>
<repository>
<id>glassfish-extras-repository</id>
<url>http://download.java.net/maven/glassfish/org/glassfish/extras</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.glassfish.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>compile</scope>
<type>jar</type>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
根据我的理解,由于<scope>test</scope>
玻璃鱼依赖性,它不会被包括在常规compile
阶段.
因为这两个依赖项都将包含在test-compile
阶段中,所以我确定将glassfish依赖项置于javaee-api依赖项之前,以便在编译测试类时优先使用前者.因此,当仅使用Maven构建时,此配置不是问题.
但是,当使用m2e和Eclipse时,glassfish依赖项列在我的构建路径中:
因为在java-ee-api依赖项之前列出了glassfish依赖项,所以Eclipse似乎使用错误的lib(glassfish而不是java-ee-api)来验证/编译/查找javadoc.(实际上,我并不是100%确定编译使用的是错误的lib - 这取决于是否在Eclipse下使用Maven来执行验证代码时使用的编译,而且我不知道它是否存在 - 但是javadoc查找肯定引用了错误的lib)
除了在运行单元测试时,如何阻止Eclipse使用glassfish lib?我想确保我的编译/ javadoc查找在api上发生,而不是该api的特定实现.
我试图使用嵌入式EJB容器测试我的EJB.在生产中,我依赖于在应用程序服务器中配置的JTA数据源.但是,在测试期间,我想连接到不同的DB(内存中的Derby).
问题是我无法看到如何告诉EJB容器覆盖生产persistence.xml中定义的JTA数据源(在src/main/resources/META-INF中),并连接到我的内存中的derby DB.JTA数据源在persistence.xml文件中定义,如下所示:
<jta-data-source>jdbc/myDS</jta-data-source>
Run Code Online (Sandbox Code Playgroud)
我尝试创建一个测试persistence.xml文件(在src/test/resources/META-INF中),该文件定义:
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDataBase;create=true;" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="password" />
Run Code Online (Sandbox Code Playgroud)
但这是没有意义的,因为当我指定EJB容器使用被测模块时
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);
Run Code Online (Sandbox Code Playgroud)
容器只使用主persistence.xml文件而不是我的测试文件.
我能看到使这种方法有效的唯一方法是使用这里描述的方法- 将被测模块的类复制到一个单独的位置(例如target/ejb-testing-classes),然后复制测试persistence.xml将文件放在顶部,然后将此新位置指定给EJB容器:
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
ec = EJBContainer.createEJBContainer(properties);
Run Code Online (Sandbox Code Playgroud)
但这似乎是不必要的笨拙.如果我试图在容器中部署预先打包的模块(即依赖项),那么将来也可能是一个问题,因为我需要在合并之前爆炸jar.
我认为可能有其他属性可以传递到EJB容器中,但到目前为止我只能找到适合openEJB或websphere的属性.我使用嵌入式Glassfish来提供我的嵌入式EJB容器,因为它是目标平台.(我现在已经找到了glassfish属性 - 请参阅下面的更新#1)
当然,每个尝试使用嵌入式EJB容器和不同于生产数据库的数据源测试EJB的人都会遇到这个问题.即便是这个人也放弃了这一点并使用了默认的嵌入式数据库,这对我来说不是一个选择.
任何帮助将非常感激.
更新1:我找到了Glassfish EJB容器接受的属性列表,起初看起来我可以使用以下属性
org.glassfish.ejb.embedded.glassfish.configuration.file
Run Code Online (Sandbox Code Playgroud)
在domain.xml中定义数据源并将容器指向它.但是,根据 …
Apache Commons Collections库的4.0版本增加了泛型支持.我无法转换代码以利用它:
我想要一个MultiValueMap
以字符串作为键,以及字符串的集合作为值.但:
LinkedHashMap
)LinkedHashSet
).我能得到的最接近的是:
MultiValueMap<String, String> orderedMap = MultiValueMap.multiValueMap(
new LinkedHashMap<String, Collection<String>>(),
LinkedHashSet.class
);
Run Code Online (Sandbox Code Playgroud)
但是这会产生错误:
multiValueMap(Map<K,? super C>, Class<C>)
类型中 的方法MultiValueMap
不适用于参数(LinkedHashMap<String,Collection<String>>, Class<LinkedHashSet>)
所以现在我在仿制药地狱.任何建议都是最受欢迎的.
在4.0版之前,我通过以下方式实现了这一目标:
MultiValueMap orderedMap = MultiValueMap.decorate(
new LinkedHashMap<>(),
LinkedHashSet.class
);
Run Code Online (Sandbox Code Playgroud)
简单!我提供了LinkedHashMap
使用MultiValueMap
行为进行装饰,并指定LinkedHashSet
要用作值的collection()的类型.但是,这需要铸造,当我打电话put()
和get()
,所以我希望能够使用4.0提供的新的通用版本.
我在网上找到了一些零碎的知识,但无法将它们组合起来来解决这个具体案例。这个答案似乎是一个很好的开始,但它专门处理 EAR 依赖关系。
我的(简化的)maven项目结构如下:
parent
|__domain (a jar)
|__domain-it (integration tests for the domain module)
|__web (a war; depends on domain)
|__web-it (integration tests for the web module)
Run Code Online (Sandbox Code Playgroud)
我正在寻找以下问题的解决方案:
web
。web-it
模块中。web
模块依赖于domain
模块,web-it
因此集成测试还需要将domain
模块中的代码放在类路径上。domain
都web
依赖于一些第三方库,例如
org.apache.commons:commons-lang3
测试类路径上也需要这些库。我正在 Glassfish 3.1.2 上运行。
任何帮助,将不胜感激。对我来说很奇怪的是,没有针对这种情况的具体 Arquillian 文档,因为我认为这是一种非常常见的情况。也许我错过了一些基本的东西?
以下是我迄今为止尝试过的一些方法:
通过添加以下内容来建立web-it
依赖,如下所示:web
web-it/pom.xml
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>web</artifactId>
<version>${project.version}</version>
<scope>test</scope> …
Run Code Online (Sandbox Code Playgroud)我以为@ViewScoped
当用户在同一页面上时,我认为应该阻止bean被重建...那么为什么我的@ViewScoped
JSf控制器bean甚至在操作处理程序导致浏览器离开该视图之前被多次创建?
任何人都能指出我在正确的方向吗?
这是我的代码:
<h:form prependId="false">
<h:inputText id="descriptionField" value="#{domainEdit.domain.description}" />
<h:commandButton id="saveButton" value="save" action="#{domainEdit.save}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
@Named("domainEdit")
@ViewScoped
public class DomainEdit implements Serializable {
private static final long serialVersionUID = 1L;
protected DomainEdit() {
}
@PostConstruct
protected void init() {
System.out.println("post construct called.");
}
@PreDestroy
public void destroy() {
System.out.println("pre destroy called.");
}
public DomainEntity getDomain() {
System.out.println("displaying domain...");
// some code to return the domain
return domain;
}
public String save() {
System.out.println("saving...");
// …
Run Code Online (Sandbox Code Playgroud) 今天我从eclipse markerplace安装了Maven插件(m2e).现在我想从github签出一个项目."从SCM中检出Maven项目"对话框显示"SCM类型"下拉列表,因此我单击了一个链接以安装git的连接器.
我在另一个对话框中找到了连接器"m2e-egit",所以我检查了它,单击Finish.它失败并显示以下消息:
Operation details
Cannot complete the install because one or more required items could not be found.
Software being installed: Maven SCM Handler for EGit 0.14.0.201207041402 (org.sonatype.m2e.egit.feature.feature.group 0.14.0.201207041402)
Missing requirement: Maven SCM Handler for EGit 0.14.0.201207041402 (org.sonatype.m2e.egit 0.14.0.201207041402) requires 'bundle org.eclipse.egit.core [1.0.0,3.0.0)' but it could not be found
Cannot satisfy dependency:
From: Maven SCM Handler for EGit 0.14.0.201207041402 (org.sonatype.m2e.egit.feature.feature.group 0.14.0.201207041402)
To: org.sonatype.m2e.egit [0.14.0.201207041402]
Run Code Online (Sandbox Code Playgroud)
它声称我没有安装EGit,但我可以确认我已经从"关于Eclipse功能"对话框安装了Eclipse EGit 3.1.0.20131021548-r.
我能找到的其他信息:
Eclipse:Kelper Service Release 1 - build id 20130919-0819
Eclipse.org - m2e:1.4.0.20130601-0317 …