我现在正在查看一段Java代码,它将路径作为String并使用其获取URL URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);,然后调用String path = resource.getPath()并最终执行new File(path);.
哦,还有电话URL url = resource.toURI();和String file = resource.getFile().
我现在完全糊涂了 - 主要是因为术语,我猜.有人可以带我解决这些差异,或提供一些防伪材料的链接吗?特别是URI到URL和资源到文件?对我来说,感觉它们应该是相同的东西,分别......
之间的差异getFile(),并getPath()在此说明:有什么url.getFile()和的getPath()有什么区别?(有趣的是他们似乎都回归了Strings,这可能会增加我的心态...)
现在,如果我有一个引用jar文件中的类或包的定位器,那两个(即路径文件串)是否会有所不同?
resource.toString()jar:file:/C:/path/to/my.jar!/com/example/毕竟会给你(注意感叹号).
Java中的URI和URL 之间的区别是前者不编码空格吗?参看 Java中存在冲突的文件,URI和URL(这个答案很好地解释了这两个术语之间的一般概念差异:URI识别和URL定位;)
最后 - 最重要的是 - 为什么我需要File对象; 为什么资源(URL)不足够?(还有一个Resource对象吗?)
对不起,如果这个问题有点无组织; 它只是反映了我的困惑...... :)
我对线程概念还很陌生,并尝试更多地了解它.最近,我发现了一篇关于Jeremy Manson撰写的" Java中的易失手段"的博客文章,他写道:
当一个线程写入一个volatile变量,而另一个线程看到该写入时,第一个线程告诉第二个线程关于内存的所有内容,直到它执行对该volatile变量的写入.[...] 所有的由线程1看到的存储内容,才写信给
[volatile] ready,必须是可见的主题2,它读取值后true进行ready.[自己强调]
现在,这是否意味着在写入volatile变量时,线程1的内存中保存的所有变量(volatile或not)将在读取volatile变量后变为可见?如果是这样,是否可以从官方Java文档/ Oracle源代码中将该语句拼凑起来?从哪个版本的Java开始这个工作?
特别是,如果所有线程共享以下类变量:
private String s = "running";
private volatile boolean b = false;
Run Code Online (Sandbox Code Playgroud)
并且线程1首先执行以下操作:
s = "done";
b = true;
Run Code Online (Sandbox Code Playgroud)
然后线程2执行(在线程1写入volatile字段之后):
boolean flag = b; //read from volatile
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)
这会保证打印"完成"吗?
如果我将写入和读取放入块中而不是声明b,会发生什么?volatilesynchronized
另外,在题为" 线程之间是否共享静态变量? "的讨论中,@ TREE 写道:
不要使用volatile来保护多个共享状态.
为什么?(对不起;我还没有就其他问题发表评论,或者我会在那里问过......)
我是一个后端开发人员,对npm,bower,gulp,grunt和Yeoman有点困惑.每当我问某人他们的目的是什么时,答案往往归结为依赖经理 - 对所有人而言.当然,我们不需要四种不同的工具,它们都是一样的吗?
有人可以用尽可能少的句子来解释每个有益的东西- 如果可能的话,每个工具只使用一个,使用五岁的语言(具有开发技能)可以理解吗?
例如:
我过去曾经使用过maven,Jenkins,nexus和ant; 也许您可以将上述工具与这些工具进行比较?
也可以随意添加其他前端工具到列表中.
这是我到目前为止所发现的 - 不确定它是否正确,但是:
我接近了吗?:)
假设我有一个A依赖于项目的开发项目B- 该项目目前正在开发中,尚未发布.
所以,在APOM文件中,我有以下部分:
<dependency>
<groupId>com.example</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0-SNAPSHOT</version>
<\dependency>
Run Code Online (Sandbox Code Playgroud)
在工作中,我们有一个远程仓库(Nexus)和一个CI盒(运行Jenkins).
当我的同事改变B并提交给SVN时,Jenkins会选择更改,编译并将其放入远程仓库.大约在那个时候,我可能会B在本地打开,进行更改,编译并将其安装到我的本地仓库中.
B当我尝试mvn clean install A本地时,Maven现在如何解决?
前几天我们弄得一团糟,基本上不得不手动删除本地存储库,以确保我们得到了我们期望获得的版本.所以我现在想弄清楚究竟发生了什么.(因此,如果你有详细文档中的地点的链接,那也将非常感激...)在本地,我有时在我的存储库文件夹中有一些SNAPSHOT版本,一个没有,有几个用什么看起来像SNAPSHOT文件名部分之后的时间戳...
snapshot dependency-management pom.xml maven dependency-resolver
如果测试类和JUnit都在类路径上,则可以从命令行运行JUnit测试,如下所示:
java org.junit.runner.JUnitCore TestClass1 TestClass2
Run Code Online (Sandbox Code Playgroud)
现在,有没有办法在包(和子包)中运行所有测试?
我正在寻找类似的东西
java org.junit.runner.JUnitCore com.example.tests.testsIWantToRun.*
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法(不涉及maven或ant)?
我正在看詹金斯的工作并试图理解它.
我的Build部分中有一个Execute shell命令框:
> mkdir mydir
> cd mydir
>
> svn export --force https://example.com/repo/mydir .
Run Code Online (Sandbox Code Playgroud)
当Jenkins完成执行该命令后,继续进行下一个构建步骤,它的工作目录是什么?
workspece-root/还是workspace-root/mydir?
下一步,我有Invoke顶级Maven目标(仍然在Build部分).
我真正想知道的是:为什么要成功执行?
是因为Jenkins workspace-root/在执行shell命令框后自动移回文件夹,还是因为下一个作业是"顶级"作业,而Jenkins因此更改回workspace-root/?
在stackoverflow上,我经常看到使用Thread.currentThread().isInterrupted().Runnable在while循环中实现和使用它时,如下所示:
public void run() {
while(!Thread.currentThread().isInterrupted()) { ... }
}
Run Code Online (Sandbox Code Playgroud)
是否有任何不同使用Thread.interrupted()(除了interrupted使用时清除标志interrupted())?
我也见过Thread.currentThread().interrupted().这是正确的使用方式,还是Thread.interrupted()足够的?
我在几个stackoverflow的答案中读到,当从Cp1252(又名Windows-1252;它们是相同的,不是吗?)转换为UTF-8时,某些字符不能直接映射(或者甚至是"不可映射的"),例如:https://stackoverflow.com/a/23399926/2018047
有人可以对此有所了解吗?这是否意味着如果我将源代码从cp1252批量/批量转换为utf-8,我会得到一些最终会成为垃圾的字符?
我想使用Java(而不是Gherkin)手动设置Cucumber DataTable.
在小黄瓜,我的桌子看起来像这样:
| h1 | h2 |
| v1 | v2 |
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的Java看起来像这样:
List<String> raw = Arrays.asList( "v1", "v2");
DataTable dataTable = DataTable.create(raw, Locale.getDefault(), "h1", "h2");
Run Code Online (Sandbox Code Playgroud)
我得到的是带有标题但没有内容的DataTable.它也比预期的要长:
| h1| h2 |
| | |
| | |
Run Code Online (Sandbox Code Playgroud)
我确信解决方案必须相当简单,但我现在有点不知所措.拿桌子需要做什么?
我是 ngrx 的新手(并且从未使用过 redux)并且我试图理解这一切 - 特别是是否需要状态的深层副本。这是我到目前为止所学到的以及仍然让我感到困惑的内容(以粗体显示)。
该NGRX文档状态是
每个 reducer 函数都会获取最新调度的 Action、当前状态,并确定是返回新修改的状态还是原始状态。
他们还指出状态转换需要不变地发生——如果你改变状态,它需要在一个副本上:
每个动作都不变地处理状态转换。这意味着状态转换不会修改原始状态,而是使用扩展运算符返回一个新的状态对象。
但是,他们没有说明为什么这是必要的,除了促进引用完整性(我不太确定如何确保您的引用指向数据 - 我只知道关系数据库上下文中的术语 - 全部发挥作用):
spread 语法将属性从当前状态复制到对象中,创建一个新的引用。这确保了每次更改都会产生一个新状态,从而保持更改的纯度。这也促进了引用完整性,确保在发生状态更改时丢弃旧引用。
不过,那(参照完整性和上面的部分)并没有真正解释为什么这是必要的。
在 SO 的其他地方,我发现一条评论表明它允许将 Angular 的更改检测策略更改为OnPush.
(我也有点困惑,如果一个动作可以触发多个 reducer,结果状态副本可以合并,但这显然是由每个 reducer 专门处理单独的状态切片和 redux 意识到这一点来解释的。)
不过,重要的事情似乎是,状态的浅或深副本创建了一个新的 reference,这意味着 ngrx 正在向其订阅者推送更改:
如果返回的对象引用发生了变化,它将触发有关特定状态的任何相关 RxJS 状态订阅。使用一些好的 ngrx 选择器可以最小化触发哪些订阅。
一般来说,Redux FAQ列出了为什么不变性是一件好事以及为什么 redux 需要它:
提高性能、更简单的调试、更容易推理、更安全的数据处理、浅层相等性检查
他们还说它
使复杂的变化检测技术能够简单且廉价地实施,确保更新 DOM 的计算成本高昂的过程仅在绝对必须时发生
正如刚刚指出的(作为不变性的要求之一)redux 会进行浅层相等性检查。
然而,Nrgx 的文档推荐深度克隆(另外,如果副本引用旧对象,状态并不是真正不可变的,我想):
注意:spread 操作符只做浅拷贝,不处理深度嵌套的对象。您需要复制对象中的每个级别以确保不变性。有处理深度复制的库,包括 lodash 和 immer。 …
java ×4
angular ×1
bower ×1
codepages ×1
command-line ×1
cp1252 ×1
cucumber ×1
cucumber-jvm ×1
gherkin ×1
gruntjs ×1
immutability ×1
interrupt ×1
javascript ×1
jenkins ×1
junit ×1
maven ×1
ngrx ×1
npm ×1
pom.xml ×1
redux ×1
runnable ×1
snapshot ×1
state ×1
synchronized ×1
terminology ×1
tooling ×1
unit-testing ×1
url ×1
utf ×1
utf-8 ×1
volatile ×1