我发现某人的pom.xml中使用了maven-shade-plugin.我之前从未使用过maven-shade-plugin(我是Maven n00b),所以我试着理解使用它的原因及其作用.
我查看了Maven文档,但是我无法理解这句话:
"这个插件提供了将工件打包在超级jar中的功能,包括它的依赖关系和阴影 - 即重命名 - 一些依赖项的包." 页面上的文档似乎不是新手友好的.
什么是"超级罐子?" 为什么有人想制作一个?重命名依赖项包的重点是什么?我试图通过maven-shade-plugin apache页面上的示例,例如"为Uber Jar选择内容",但我仍然无法理解"着色"所取得的成就.
任何指向说明性示例/用例的指针(解释为什么在这种情况下需要着色 - 解决了什么问题)将不胜感激.最后,我什么时候应该使用maven-shade-plugin?
如何再次将AWS S3公用文件夹设为私有?
我正在测试一些临时数据,所以我在一个桶中公开了整个文件夹.我想再次限制它的访问权限.那么如何让文件夹再次保密呢?
我想在给定的地图中找到一个特定的键.如果找到密钥,那么我想从地图中获取该密钥的值.
这是我到目前为止所管理的:
def mymap = [name:"Gromit", likes:"cheese", id:1234]
def x = mymap.find{ it.key == "likes" }
if(x)
println x.value
Run Code Online (Sandbox Code Playgroud)
这是有效的,输出是"奶酪"如预期的那样.太好了,但最后我不想做x.value
,我不想做if(x)
.我希望x以某种方式直接包含值.
我不能像这样直接获取x的值:
def mymap = [name:"Gromit", likes:"cheese", id:1234]
def x = mymap.find{ it.key == "likesZZZ" }.value
println x
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下find闭包为null,所以这会导致Null指针异常.当然,上面的代码片段可以工作it.key == "likes"
,但我不确定我是否总会在地图中找到目标键.
什么是"Groovier"并且在地图上安全地执行此操作:
我注意到Ruby on Rails代码有2个空格缩进,例如:
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
...
t.timestamps
end
end
...
end
Run Code Online (Sandbox Code Playgroud)
这是一个有2个空格的约定吗?(我以前用Tab缩进,通常是4个空格.)
额外奖励:有没有人知道如何在电子文本编辑器中将Tab大小从4个空格更改为2个空格?
我想用单引号包装列表的每个元素并将它们连接成一个字符串.
样本输入: ["aa", "bb", "cc"]
预期产量: "'aa', 'bb', 'cc'"
我猜这可以用一个收集+闭包来完成,所以我试过:
def mylist = ["aa", "bb", "cc"]
println mylist.collect{ 'it' }.join(', ')
Run Code Online (Sandbox Code Playgroud)
但输出是:"it, it, it"
这不是我想要的.
如何在列表的每个元素中附加和预先添加单引号?除收集和加入之外的任何其他oneliner(或短)groovy解决方案?
我正在尝试将文本文件中的所有时间戳(形式为'HH:MM:SS')增加一个命令行参数指定给我程序的秒数.
这是迄今为止我的努力的简化版本:
import re
from datetime import datetime, timedelta
time_diff = timedelta(seconds=10)
def replace_time(matchobj):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")
print re.sub('(\d\d:\d\d:\d\d)', replace_time, "01:27:55")
Run Code Online (Sandbox Code Playgroud)
这很好用:运行它的结果01:28:05
就是我想要的.
但是,我听说我应该尽可能少地使用全局变量.所以我想知道是否有一种简单的方法可以time_diff
作为参数传递replace_time
而不是使用全局变量.
我尝试了显而易见的,但它失败了:
def replace_time(matchobj, time_diff):
if matchobj.group(1) not in [None, '']:
return (datetime.strptime(matchobj.group(1), "%H:%M:%S") + time_diff).strftime("%H:%M:%S")
time_diff = timedelta(seconds=10)
print re.sub('(\d\d:\d\d:\d\d)', replace_time(matchobj, time_diff), "01:27:55")
Run Code Online (Sandbox Code Playgroud)
有这个错误:NameError: name 'matchobj' is not defined
所以我不能直接传递matchobj.
我看过标准的重新页面和标准的re howto,但找不到我需要的信息.我怎样才能避免在这里使用全局变量?我可以以某种方式向replace_time
函数传递额外的参数吗?提前致谢.
是否可以使用 Terraform 创建包含身份验证和存储资源的 AWS Amplify 项目?
目标是将 Android 客户端项目与使用 Terraform 模板创建的 Amplify 资源相关联。
例如:我想amplify pull
从我的 Android Studio 终端将项目链接到 AWS(其中 Amplify 项目已经由 Terraform 创建)并生成配置文件。
我目前可以通过以下方式一次获取一个节点的一个属性knife search node
:
knife search node "chef_environment:production AND name:i-7a421114" -a cloud.public_hostname
# RESULT:
i-7a421114:
cloud.public_hostname: ec2-104-214-107-198.compute-1.amazonaws.com
knife search node "chef_environment:production AND name:i-7a421114" -a cloud.local_hostname
# RESULT:
i-7a421114:
cloud.local_hostname: ip-10-60-146-201.ec2.internal
Run Code Online (Sandbox Code Playgroud)
我想通过一次调用同时检索两个属性,如下所示:
knife search node "chef_environment:production AND name:i-7a421114" -a cloud.public_hostname -a cloud.local_hostname
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,只获得一个属性.由于我几乎没有厨师/刀具知识,有人可以让我知道如何做到这一点,或其他一些方法来实现这一目标.
我在纽约黄色TaxiCab公共数据集的 Google BigQuery中有一个约100万行的表格.从该链接可以看出,架构没有主键.每行代表一次旅行/交易,但没有customer_id
字段.
我想添加一个列customer_id
并向其分发随机数,以便:
For rows 1-20, `customer_id` should be assigned `1`
For rows 21-40, `customer_id` should be assigned `2`
and so on..
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望表中的确切(和任何)20行具有特定值customer_id
.
我正在尝试将日志记录添加到简单的rspec测试中.我正在使用Watir在规范中驱动Chrome,这很好用.我无法使用"Logger"库获取日志.
这是我的规格:
require 'rubygems'
require 'watir-webdriver'
require 'rspec'
require 'logger'
describe 'ui tests' do
let(:browser) { browser ||= Watir::Browser.new :chrome }
let(:log) {
log = Logger.new(STDOUT)
log = Logger.new('watir.tests.log', 'daily')
log.level = Logger::DEBUG
}
before {
browser.goto 'http://translate.google.com'
}
after { browser.close }
context 'simple tests' do
it 'simple test' do
log.info("Running simple test")
browser.text_field(:id => "source").set("ost")
# actual test/asserts here
end
end
end
Run Code Online (Sandbox Code Playgroud)
问题是我无法在示例中调用任何日志记录方法,如log.info.我收到此错误:
Failures:
1) ui tests simple tests simple test
Failure/Error: log.info("Running simple test")
NoMethodError:
undefined method …
Run Code Online (Sandbox Code Playgroud) 我习惯于对shell上的代码进行python风格的REPL测试,我正在学习Java.我最近了解到几乎所有Java代码都可以通过groovy以REPL方式执行.到目前为止,groovy控制台帮助我快速测试我的Java代码片段.
我试图在groovy控制台中运行以下Java代码(我碰巧从另一个Stackoverflow问题得到):
String md5(String s)
{
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i=0; i<messageDigest.length; i++)
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
}
String md5hash = md5("a test message");
Run Code Online (Sandbox Code Playgroud)
当我尝试执行此操作时,我收到以下错误消息:
基元类型文字:字节不能用作行的方法名称:5列:13.文件:ConsoleScript0 at line:6,column:13
我在SO和其他地方搜索了错误信息,但我无法获得任何线索.它似乎是有效的Java代码,为什么groovy认为我正在尝试使用"byte"作为方法名称?
我正在使用Groovy版本:1.8.4 JVM:1.6.0_26
groovy ×3
closures ×2
java ×2
acl ×1
amazon-s3 ×1
android ×1
aws-amplify ×1
chef-infra ×1
collections ×1
dictionary ×1
indentation ×1
jar ×1
knife ×1
logging ×1
maven ×1
mysql ×1
python ×1
rspec ×1
ruby ×1
sql ×1
terraform ×1