我正在编写一个简单的Groovy应用程序,需要进行一些日志记录.记录事物的实际属性取决于特定环境.例如,在开发时我只想登录到控制台,在测试和生产中我可能想要写入文件,在生产中我可能想要发送最严重事件的电子邮件.
现在我正在做的事情看起来像这样:
import org.apache.log4j.Logger
import org.apache.log4j.PropertyConfigurator
class BaseClass {
protected config
static Logger logger = Logger.getLogger(BaseClient.class)
def BaseClass(env) {
def configFilePath = // whatever
config = new JsonSlurper().parseText(configFile.text)[options.env]
def logConfigFilePath = ['somelogdir', config.log_file].join(File.separator)
PropertyConfigurator.configure(logConfigFilePath)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要进行日志记录的所有类都继承自BaseClass.
通过这种方式,我可以为每个环境指定不同的文件名,然后从那里读取日志记录配置.但它似乎有很多样板,并迫使我使用可能不理想的层次结构.
另一方面,在这里我看到我可以获得一个带有简单注释的记录器.
有没有办法根据环境获得不同的记录器 - 可以在运行时设置?
我在Groovy中有一个很小的应用程序.目前我可以在命令行上测试它,但我需要将它与Jenkins服务器集成.因此,我曾考虑将其与Gradle集成,以Jenkins可以读取的标准格式生成测试输出.(请考虑一下我是Groovy,Gradle,Jenkins和JVM环境的新手).
目前,我所有的测试都在一个MyTest扩展的类中GroovyTestCase.我可以用一个像bash这样的小脚本来运行它
#! /bin/bash
DIR=$( cd "$( dirname "$0" )" && pwd )
LIBS="$DIR/lib/*"
groovy -cp "$LIBS" path/to/MyTest.groovy
Run Code Online (Sandbox Code Playgroud)
在这种布局中有很多我不喜欢的东西:
lib目录是一个好习惯 - 可能不是.Gradle似乎正是我需要的工具.但是我发现的所有文档都假定了Java,Ant,Maven和整个生态系统的先前知识.
创建有效的Gradle项目的基本步骤是什么?
我按照此处的建议重新组织了目录结构,但我不明白如何声明依赖项.例如,使用此build.gradle
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.0'
runtime group: 'org.apache.log4j', name: 'log4j', version: '1.2.0'
}
Run Code Online (Sandbox Code Playgroud)
我得到了错误
unable to resolve class org.apache.log4j.Level
@ line 5, column 1.
import org.apache.log4j.Level
^
Run Code Online (Sandbox Code Playgroud)
如果我将存储库更改为
repositories {
mavenCentral()
flatDir { dirs …Run Code Online (Sandbox Code Playgroud) 可能重复:
合并两个映射并将相同键的值相加的最佳方法是什么?
我有一堆类型的地图Map[String, Int].我希望能够在键对应时将它们合并为值.例如,++地图上的标准方法给出了
Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 3, b -> 2, c -> 5)
Run Code Online (Sandbox Code Playgroud)
我想定义一个结果会给出的操作
Map("a" -> 1, "b" -> 2) ?? Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 4, b -> 2, c -> 5)
Run Code Online (Sandbox Code Playgroud)
在花哨的措辞中,Map[A, B]总是具有幺半群的自然结构,但是当B它本身就是幺半群时有一个不同的结构.
现在,编写一个递归实现并不困难LinkedHashMap,但我认为必须有一些简单而更通用的方法来编写它,可能使用scalaz.有任何想法吗?
我开始使用Ractive,我想更好地了解如何制作可重用的组件.编写可在不同情况下使用的通用小部件非常容易.我的问题是,我的应用程序中的数据通常不是小部件所期望的形状,我不知道如何扩展小部件以使其更具应用程序特定性.
举一个具体的例子,假设我正在编写一个Ractive组件来设计折线图.我会做一些事情
var Chart = Ractive.extend({
template: chart,
data: {
points_to_path: function(points) {
// whatever
}
}
});
Run Code Online (Sandbox Code Playgroud)
用像这样的模板
<svg>
{{# points_to_path(points) }}
<path d="{{ path }}" />
{{/ end of path }}
</svg>
Run Code Online (Sandbox Code Playgroud)
这个组件可以像
var chart = new Chart({
data: {
points: [[1, 2], [3, 4], [5, 6]]
}
});
Run Code Online (Sandbox Code Playgroud)
现在假设我实际上需要使用这样的组件.可能我的数据不是像points上面那样以双组件数组的形式出现的.也许我有更喜欢的东西
[
{
date: 'aug 2011',
value: 12.51
},
{
date: 'sep 2011',
value: 12.38
},
...
]
Run Code Online (Sandbox Code Playgroud)
所以,我想要做的是更具体的应用程序Chart,接受上述形式的数据.我没有看到一个简单的方法Chart.extend,因为对points变量的引用是硬编码的 …
我是symfony的初学者,我无法理解表格生成.从理论上讲,甚至还有一个表单框架,具有完全的灵活性.但是,据我所知,表单在symfony中呈现为表格.我习惯CakePHP,我可以一次输出一个输入元素,然后按照我的意愿包装它们:在表格,div,无论什么,或者,通常都没有,只需使用CSS来正确定位它们.
我有点震惊的是,一个具有如此高标准的代码质量的框架然后输出不需要它们的HTML表.我想我只是错过了一些东西.
有没有办法将表单作为表单输出,没有额外的HTML标签?
我正在CakePHP应用程序中实现OpenId登录.在某个时刻,我需要重定向到另一个动作,同时保留有关OpenId身份的信息,例如,它本身就是一个URL(带有GET参数),例如
https://www.google.com/accounts/o8/id?id=31g2iy321i3y1idh43q7tyYgdsjhd863Es
我如何传递这些数据?第一次尝试将是
function openid() {
...
$this->redirect(array('controller' => 'users', 'action' => 'openid_create', $openid));
}
Run Code Online (Sandbox Code Playgroud)
但显而易见的问题是,这完全搞砸了CakePHP解析URL参数的方式.
我需要做以下任何一种情况:
1)以CakePHP友好的方式对URL进行编码以传递它,然后对其进行解码,或者
2)将URL作为POST参数传递
但我不知道该怎么做.
编辑:回应评论,我应该更清楚.我正在使用OpenId组件,我有一个有效的OpenId实现.我需要做的是将OpenId链接到现有的用户系统.当新用户通过OpenId登录时,我会询问更多详细信息,然后使用此数据创建新用户.问题是我必须在整个过程中保留OpenId URL.