我正在处理一些Java代码,其中Velocity 1.7设置为通过ClasspathResourceLoader检索模板.下面是代码的精简样本.它来自在Jetty服务器上运行的Tapestry Web应用程序.
Java类,模板和要包含的文件都在同一个文件夹"testpackage"中,因此在生成的JAR中它们都在同一个包"testpackage"中.
问题是,如果模板包含
#include("MyInclude.vm")
Run Code Online (Sandbox Code Playgroud)
指令,Velocity找不到"MyInclude.vm",它抛出一个ResourceNotFoundException.
因为在getTemplate的参数中我必须将包名称添加到模板名称,我还尝试在模板内的#include中执行相同的操作:
#include("testpackage/MyInclude.vm")
Run Code Online (Sandbox Code Playgroud)
但唯一的区别是后者可以运行,如果我从Eclipse运行Web应用程序,而前者甚至不能从Eclipse工作.如果我构建,部署JAR并从部署中运行Web应用程序,则两种语法都会失败并出现相同的ResourceNotFoundException.
http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html#Include上的Velocity文档说:
"出于安全原因,要包含的文件可能只在TEMPLATE_ROOT下"
这肯定可能是我的问题的原因,但我还没有找到任何关于TEMPLATE_ROOT实际上是什么的进一步信息.
这听起来很像环境变量,但我不知道应该将它设置为什么,因为我使用的是ClasspathResourceLoader,并且要包含的文件不是位于文件夹中的实际文件,它位于JAR内部包含模板和Java类(以及所有在同一个包中).
我在另一个问题中找到了TEMPLATE_ROOT,我应该在哪里为使用Maven构建的命令行实用程序放置Velocity模板文件?,但它与使用FileResourceLoader有关.我需要继续使用ClasspathResourceLoader,我需要所有文件都在JAR中,而不是像某些文件夹中的普通文件一样.
package testpackage;
import java.io.StringWriter;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
public class TestVelocity
{
public static String getText()
{
String text = "";
Properties properties = new Properties();
properties.setProperty("resource.loader", "class");
properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
VelocityEngine engine = new VelocityEngine();
VelocityContext context = new VelocityContext();
StringWriter writer = new StringWriter();
try
{
engine.init(properties);
// This works because the template doesn't contain any …Run Code Online (Sandbox Code Playgroud) 我有一个存储数字的字符串.现在我想解析该字符串并获得浮点数.
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
try {
System.out.println(Integer.parseInt(" 2 "));
} catch(NumberFormatException e) {
System.out.println("Exception caught");
}
System.out.println(Float.parseFloat(" 2.4 "));
}
}
Run Code Online (Sandbox Code Playgroud)
现在在上面的代码中,如果你运行它将成功.我的问题是为什么在整数的情况下尾随空格抛出一段NumberFormatException时间解析一个浮点并不抛出一个?
PS:booolean和double解析的情况相同.
PPS:为什么java中存在不一致?我已经检查了源代码
我在使用Android应用程序登录Google Play时遇到问题,我补充说:编译'com.google.firebase:firebase-auth:11.4.2'并编译'com.google.android.gms:play-services-auth:11.4 .2'在我的gradle依赖项中.
我只有像GoogleSignInApi或GoogleSignInAccount这样的课程,我不知道如何导入其他人.
我的意思是像GoogleSignIn或GoogleSignInClient这样的课程.我只是在图书馆看不到它们.
我用 Java 编写一个 tcp 客户端,它应该从某个服务器接收数据。
据我所知,如果客户端无法处理来自服务器操作系统的传入数据,则会开始缓冲数据。但如果缓冲区已满怎么办?该行为可以配置吗?
我的意思是我想限制服务器数据流,直到客户端可以处理数据,这样数据就不会丢失。是否可以?
我正在尝试使用模板来创建type_info::name()发出const限定名称的函数的模拟.例如typeid(bool const).name(),"bool"但我想看"bool const".所以对于泛型类型我定义:
template<class T> struct type_name { static char const *const _; };
template<class T> char const *const type_name<T>::_ = "type unknown";
char const *const type_name<bool>::_ = "bool";
char const *const type_name<int>::_ = "int";
//etc.
Run Code Online (Sandbox Code Playgroud)
然后type_name<bool>::_是"bool".对于非const类型,显然我可以为每种类型添加一个单独的定义,等等char const *const type_name<bool const>::_ = "bool const";.但是我想我会尝试使用部分特化和连接宏来在一行中派生任何类型的const限定名称const - 先前定义的资格名称.所以
#define CAT(A, B) A B
template<class T> char const *const type_name<T const>::_
= CAT(type_name<T>::_, " const"); // …Run Code Online (Sandbox Code Playgroud) 当我创建一个新的分支时,如果我设置" 配置上游推送和拉动 ",则会出现一个警告(在屏幕截图中以蓝色圈出).为什么不推荐这个?这有哪些潜在的问题或缺点?
我通过搜索引擎运行了这个警告,并在https://git-scm.com和https://www.eclipse.org/egit/上搜索了它,但我一无所获,当我点击"?"时 该对话框中的帮助按钮没有任何反应
此外,如果我想遵循该警告的建议并"使用远程分支",我该怎么做?除了" 配置上游推送和拉动 "复选框之外,我在该对话框中更改的任何内容都不会导致警告消失.
而不是通常if (myString == null || myString.equals(""))我倾向于使用org.apache.commons.lang.StringUtils类和做if (StringUtils.isEmpty(myString)).
然而,这 - 至少我正在做的方式 - 带来了巨大的缺点:因为FindBugs - 或编译器警告机制,f.恩.来自Eclipse - 将不再看到显式的空检查,它将不再被myString视为可能为null,因此它将不再引发关于它的潜在(或确定)空指针的警告,并且这些警告在我的视图中非常有用.
示例(已添加):
import org.apache.commons.lang.StringUtils;
public class TestWarning
{
void testWarning(String myString)
{
//if (myString == null || myString.equals("")) // With this, the last line shows the warning.
if (StringUtils.isEmpty(myString)) // With this, no warning.
{
// Anything.
}
int x = myString.length(); // Warning is here: "Potential null pointer access: The variable myString may be null at …Run Code Online (Sandbox Code Playgroud) 这对我来说听起来像是一个普遍的问题,所以我想知道是否有一个通用的推荐方法来处理这些情况,无论使用什么构建/依赖管理工具(在我的例子中是 Gradle)。我可以想象,无论使用什么构建工具,都会出现这个问题,即使是在手动处理少数依赖项并且仅使用 Java 使用命令构建的小项目中也是如此jar。
我的 Java 项目使用 Velocity 1.7,因此它的类路径中有 Velocity 1. 7 JAR。
然而,该项目还使用 ReportNG,它依赖于 Velocity 1. 4Class-Path: velocity-dep-1.4.jar (它甚至在其清单中具有该条目,加上其下载的 zip 包含内容velocity-dep-1.4.jar,并且其主页明确提到该条目velocity-dep-1.4.jar必须位于类路径中)。
我想知道如何避免在我的类路径上出现两个 Velocity 版本的 JAR,这可能是导致我看到的奇怪行为的原因,而且无论如何这听起来都不是一个好主意。
我将尝试让 ReportNG 使用 Velocity 1.7 而不是 1.4,但它不一定有效,如果有一种干净的方法来处理这些情况,我想避免这样做。
快速失败:意味着如果他们在迭代开始后检测到集合已经发生了变化,那么他们就会抛弃未经检查的东西
ConcurrentModificationException.
我写了一个测试示例来解决这个问题:
String hi = "Hi";
list.add(hi);
list.add("Buy");
System.out.println("list before: " + list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
list.add("Good");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
list before: [Hi, Buy]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at thread.CollectionTest.main(CollectionTest.java:19)
Run Code Online (Sandbox Code Playgroud)
这是预料之中的.但是,删除元素时,不会抛出异常:
List<String> list = new ArrayList<>();
String hi = "Hi";
list.add(hi);
list.add("Buy");
System.out.println("list before: " + list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
list.remove(hi);
}
Run Code Online (Sandbox Code Playgroud)
输出:
list before: [Hi, Buy] …Run Code Online (Sandbox Code Playgroud) 这开始发生在我和我的所有队友的某个时刻,我们无法弄清楚触发的是什么,以及如何解决这个问题.
我们在工作区中都有相同的Java项目.在Project菜单中我们都Build automatically勾选了.
假设我的工作区没有编译错误.我对其中一个Java类进行了一个微不足道的更改,我保存,Eclipse开始重建,结果是数百个类 - 在多个项目中 - 现在有编译错误.这是因为由于某种原因,import现在很多语句都显示错误导入[xxx]无法解析.
但是import在我保存完全无关的变化之前,那些s(以及整个工作空间)完全没有错误,并且如果在这一点上我只是做Project / Clean了当然会触发一个,那么它们都会完全没有错误工作区重建.
在.log工作区中的文件夹不显示任何文件; 如果在我保存之前它是空的,那么在我保存之后它仍然是空的,导致出现这些错误.
这比听起来更烦人,因为构建整个工作区可能需要几分钟,而且由于仅仅Project / Clean使所有失败import的工作再次起作用,这不能归因于我们的代码中的错误.
我知道这是一个很长的镜头,但考虑到这个问题对我们来说是多么可重复(100%的时间在所涉及的几台计算机上100%),也许其他人有同样的问题,并发现原因或解决方案.
该版本是适用于Web开发人员的Eclipse Java EE IDE,适用于Windows 8的Mars.1发行版(4.5.1).
我们通过创建指向gradlew.bat和使用字符串提示的外部工具配置来使用Gradle(2.6).我们手动运行这些项目以在将项目导入Eclipse后进行配置(通过输入eclipse字符串提示符)并为部署构建JAR(通过输入build字符串提示符),但我不认为Gradle涉及问题由Eclipse构建.
补充:我不再确定这个问题100%可重复是否准确,因为会发生以下情况:
初始状态:不存在错误(这只能是因为我清理了所有项目)并且没有未保存的更改.
我在编辑器中对一个类进行了更改,我保存并生成错误.
我撤消了改变,保存和清理; 所以我回到了初始状态.
我重做那个改变(相同),我保存,这次我没有得到错误.
新增:使用javap检查生成的.class文件,我注意到2件以下的事情:
1)无论是否.class使用错误构建文件(次要版本:0;主要版本:51),次要版本和主要版本始终相同.当然,当.class文件是使用错误构建的时,它包含错误消息,而当它构建时没有错误,它不包含错误消息.
2)比较javap两个.class文件的输出,我看到在"常量池"部分中,行是相同的(显示类成员和对象的名称,f.ex.Ljava/lang/String;)直到有关有my.package.MyClassImpl问题.class文件 的类的一行
#32 …